如何保护源代码中的密码/密钥

信息安全 加密 密码 源代码
2021-09-02 23:03:00

如果源代码中需要有密码,应该如何保护?这纯粹是一个例子,但是假设有一个应用程序正在使用 API,并且您不想公开您的 API 密钥,但您需要在源代码中包含它,因为它已被使用。您如何有效地使用用户无法检索的字符串。不向服务器询问字符串似乎是不可能的。

RE:为什么我们仍然可以在 12 行 Ruby 中破解 snapchat 照片?

4个回答

简短的回答:你不能

您永远无法保护您正在分发的密码。您可以将它隐藏在一些字符串之间并使用其他操作来“覆盖”密码,但最终您必须将它们放在一起以使您的功能能够运行。这就是饼干要去的地方。

解决这个问题没有简单的方法,通常这意味着你没有选择最好的安全方案,或者,如果你觉得足够了,也许这意味着你不需要这种安全性。

如果你真的,真的,真的需要这样做,你将不得不使用“默默无闻的安全”,破解所需的时间越长越好。当这种情况发生时,你最好有一些检测系统。

例如,考虑这些年来游戏行业的复制保护等等,如果有办法在代码本身内实现安全,这将意味着“盗版”的终结。

虽然@kiBytes 的答案在实践中是正确的,但我想补充一点Amit Sahai最近的一篇论文提出了一种(理论上的)方法来构建一个在密码学上“难以”逆转的黑盒混淆器。(有关它的有线文章,请参见此处)。

然而,它并不是你可以甚至应该实现它:到目前为止,在真正的软件上使用它是完全不切实际的,而且还没有经过适当的审查。尽管如此,这很有趣。

正如@kiBytes 所说,您根本无法保护源代码中的密码或密钥。我要补充一点(如果人们遇到这个问题试图解决一个普遍的问题),在您给出的示例(使用 API 的应用程序)中,不需要将 API 密钥存储在应用程序源代码中。

通常,API 密钥存储在您控制的服务器上。要访问 API,您的应用程序向服务器发出请求,服务器本身向 API 发出请求,然后使用从 API 检索到的信息回复您的应用程序。

顺便说一句,理想情况下,API 密钥也不存储在服务器上的源代码中,因为这可能已检查到版本控制中,因此可能不安全。

我在 20 年前所做的事情是将键拆分为单个字符,然后构建一个对象集合,一旦对象根据类的另一个属性进行排序,这些对象就会以正确的顺序显式返回这些字符。使用混淆,这很难破解,特别是如果对象的正确顺序难以确定(例如,它会根据应用程序环境而变化)。