安全地保存常量值

时间:2013-12-19 10:43:13

标签: android properties reverse-engineering proguard

我正在开发与安全数据通信相关的Android应用程序。我在我的应用程序中使用了一些常量值,并将它们保存在constant.java类中。我不希望这些值被反向设计,但即使我使用ProGuard for Android,对于专家来说,很容易反转代码。这些常量非常安全。我可以使用属性文件或res文件夹中的任何文件,但这种方法根本不安全。

任何人都可以告诉我如何继续吗?有没有任何文件格式我可以保存我的常量或阻止属性文件进行逆向工程。是否有任何选项,如以.py python文件格式保存并从Android代码中读取它?

2 个答案:

答案 0 :(得分:4)

从根本上不可能在设备上安全地存储秘密常数,因为黑客可以通过静态和动态分析对它们进行逆向工程。你只能通过混淆值来使它变得更加困难:

  • 使用某种算法计算它们,而不是按字面意思存储它们。即使是微不足道的算法也可能会增加提取常量所需的时间。
  • 在整个代码中分发值的组成部分。
  • 使用本机代码。反向工程通常更加困难,至少如果代码及其API足够大且复杂。
  • 也许看看白盒加密技术,它试图将常量密钥编织到加密算法的实现中,这样就无法提取常量密钥。这仍然是研究和高端商业解决方案的领域。

您可以从伦敦Droidcon的my presentationScott Alexander-Bown's presentation处获得一些建议。

您还可以使用商业混淆器,如ProGuard的扩展版DexGuard,使用字符串加密和类加密等技术为您强化代码。

保护的有效性取决于您可以投入的时间和精力,产品价值,黑客愿意花费的时间和精力,他们的专业知识等。

类似的问题:Best Practice for storing private API keys in Android

(我是ProGuard和DexGuard的开发者)

答案 1 :(得分:1)

答案是不要这样做!。秘密常数绝不是秘密。您应该始终假设对手足够聪明,可以重建烟幕背后隐藏的内容。

无论如何,您不需要这样做。为了安全通信,请改用公共密钥基础结构。这大致上是这样的。

您的服务器生成一个私钥和公用密钥,然后在您的应用程序安装中包括公用密钥。攻击者是否发现此无关紧要。它允许您的应用程序安全地向服务器发送消息,并且只有服务器拥有私钥,服务器才能解密它。

因此,您的应用程序应该做的第一件事是生成私钥和公钥。使用操作系统提供的任何安全存储柜,以确保私钥的安全。它并非无懈可击,但是比您想出的任何东西都更加安全。然后将公钥发送到您的服务器。

现在,您可以使用服务器公钥安全地向服务器发送消息,并且服务器可以使用公钥安全地向您发送消息。

不要在这里尝试重新发明轮子。具有严格的数学和计算机科学专业资格的安全研究人员终生都在使用这些系统,如果您动摇了自己的想法,就可以让黑客入侵并窃取您的东西。使用广受信任的现成的PKI加密库(如OpenSSL),并了解覆盖该库的任何安全警报源。