【发布时间】:2012-02-06 13:17:29
【问题描述】:
Security and Design 指南详细介绍了各种方法,以使攻击者更难破坏应用内计费实施。
特别要注意的是,逆向工程.apk 文件是多么容易,即使是通过 Proguard 进行了混淆。因此他们甚至建议修改所有示例应用程序代码,尤其是“已知入口点和出口点”。
我发现缺少的是对将某些验证方法包装在单个方法中的任何引用,例如返回 boolean 的静态 Security.verify():一个好的设计实践(减少代码重复、可重用、更易于调试、自记录等),但攻击者现在需要做的就是识别该方法并使其始终返回true...所以无论我使用它多少次,延迟或不延迟,随机与否,它根本没有'没关系。
另一方面,Java 没有像 C/C++ 中那样的宏,可以减少源代码重复,但没有 verify() 函数的单一退出点。
所以我的问题:
众所周知的软件工程/编码实践与所谓的安全性设计之间是否存在固有的争论? (至少在 Java/Android/安全事务的上下文中)
可以做些什么来减轻“为安全而设计”的副作用,就本可以更简单、更易于维护和更易于调试的过于复杂的软件而言,这似乎是“在脚上开枪”?
你能推荐一些好的资源来进一步研究这个主题吗?
【问题讨论】:
-
对于应用内我相信安全类必须是你的应用服务器。
-
代码混淆的价值被热议,这不是stackoverflow的用途。
-
@coder_For_Life22 很好的幽默感。 :) 见youtu.be/TnSNCXR9fbY
-
@Vincent 你是对的。我只带了
Security.verify()作为一个简单的例子。但是将验证中继到服务器并不总是更好,正如here 所描述的案例所示。 -
@GregS 我不知道代码混淆的价值是有争议的。我认为 Google 决定将 Proguard 与 ADT 捆绑在一起是有原因的。你能详细说明一下吗?或者提供链接?
标签: java android encryption reverse-engineering decompiling