安全保存常数值

Posted

技术标签:

【中文标题】安全保存常数值【英文标题】:Saving constant values securely 【发布时间】:2014-01-07 21:23:17 【问题描述】:

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

谁能告诉我如何进行?是否有任何文件格式可以保存我的常量或防止属性文件进行反向工程。是否有任何选项,例如将其保存为 .py python 文件格式并从 Android 代码中读取?

【问题讨论】:

【参考方案1】:

答案是不要这样做!。秘密常数从来都不是秘密的。你应该总是假设你的对手足够聪明,可以重建你隐藏在烟幕后面的东西。

无论如何,你不需要这样做。对于安全通信,请改用公钥基础设施。这是大致的工作原理。

您的服务器会生成一个私钥和公钥,然后您将公钥包含在您的应用安装中。攻击者是否发现这一点并不重要。它只允许您的应用安全地向服务器发送消息,并且只有服务器可以解密它,因为只有他们拥有私钥。

因此,您的应用应该做的第一件事就是生成私钥和公钥。使用您的操作系统提供的任何安全存储柜来保证私钥的安全。它不是无懈可击的,但它比你想出的任何东西都要安全得多。然后将公钥发送到您的服务器。

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

不要在这里尝试重新发明***。在硬数学和计算机科学方面具有严格资格的安全研究人员一生都在想出这些系统,如果你破坏了你的实施,你就会让黑客侵入并窃取你的东西。使用广受信任的现成 PKI 加密库,例如 OpenSSL,并随时了解涵盖该库的任何安全警报来源。

【讨论】:

相反,我建议您执行所有能够实施的混淆和/或加密和/或篡改检查。创建应用程序所花费的时间和精力应该得到最高的保护,显然与应用程序的类型有关。但我对建议“不要这样做”完全失望,因为总会有人能够破解应用程序......相反,尽量让破解过程更难。 你完全没有抓住重点。混淆和对称加密(需要在设备上拥有密钥)可以被破解。实际的答案是根本不要在手机上存储秘密。您永远不需要这样做,该技术的存在可确保您永远不需要这样做,并且它大大更安全 伙计,令人沮丧的是,给出糟糕的安全建议的建议是+6,而且我因为给出正确的建议而被否决(不要这样做)。 Stack Overflow 通常比这更聪明。 除非您修改答案,否则我无法删除反对票。这是 SO 的限制。【参考方案2】:

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

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

您可能会从伦敦 Droidcon 的 my presentation 和 Scott Alexander-Bown's presentation 获得一些想法。

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

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

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

(我是 ProGuard 和 DexGuard 的开发者)

【讨论】:

可能是安全设计不好。即使有您的建议,也很容易在代码中添加一行(例如:Log.v(TAG,secretValue)),最终使用它并执行应用程序,它将打印该值。存储在应用程序代码/资源中的常量不能是秘密。 这是个坏建议。 “默默无闻的安全”是安全研究人员要避免的首要事项。实际的答案是根本不在电话上保守秘密。 PKI 基础设施保证即使拥有完整的源代码并可以访问存储的密钥,入侵者也不能被动地窃取数据。

以上是关于安全保存常数值的主要内容,如果未能解决你的问题,请参考以下文章

数值计算中的上溢和下溢

php常见面试题

一个数值保存复选框的值

在C语言中如何将一个数值保存到文件

(xcode) 计数器应用程序。需要保存一个整数值。

如何用matlab求解微分方程组的数值解