良好的软件工程与安全性

安全和设计指南详细概述了各种方法,使攻击者更难以破坏应用内计费实现。

特别值得注意的是,即使通过Proguard进行模糊处理,对文件进行反向工程也非常容易。因此,他们甚至建议修改所有示例应用程序代码,尤其是“已知入口点和退出点”。.apk

我发现缺少的是对将某些验证方法包装在单个方法中的任何引用,例如返回的静态:一个好的设计实践(减少代码重复,可重用,更易于调试,自我记录等),但攻击者现在需要做的就是识别该方法并使其始终返回...因此,无论我使用它多少次,延迟与否,随机与否,都无关紧要。Security.verify()booleantrue

另一方面,Java没有像C / C++那样的宏,这可以减少源代码重复,但没有函数的单一出口点。verify()

所以我的问题:

众所周知的软件工程/编码实践与所谓的安全性设计之间是否存在固有的争论?(至少在Java/Android/Secure Transactions的背景下)

可以做些什么来减轻“安全设计”的副作用,这似乎是“在过度复杂化软件方面”,这些软件本来可以更简单,更易于维护,更容易调试?

你能推荐很好的资源来进一步研究这个主题吗?


答案 1

像往常一样,这是一个权衡。使代码更难进行反向工程/破解,需要使其可读性降低且难以维护。您可以根据目标用户群,您在该地区的技能,时间/成本等来决定走多远。这并不是Android所特有的。观看此 Google I/O 演示,了解混淆和代码防篡改的各个阶段。然后决定你愿意为自己的应用程序走多远。

另一方面,您不必混淆/强化等所有代码,只需处理许可的部分等。这通常是整个代码库中非常小的一部分,实际上并不需要经常更改,所以你可能会忍受它难以遵循/维护等。只要记下它是如何工作的,这样你就可以在2年后提醒自己:)。


答案 2

您描述的柜台生产力只是冰山一角......没有软件在发布时是100%无错误的,那么当用户开始报告问题时,你会怎么做?

在禁用日志记录、堆栈跟踪和各种其他信息后,如何对字段问题进行故障排除或调试,这些信息有助于反向工程,同时也有助于合法的开发团队?


推荐