如何防止在编译后的类文件中显示字符串字面值?

8
当你把一个.java文件编译成一个.class文件时,如果你有一行像这样的代码:

String s = "This is a String"

如果您在文本编辑器中打开.class文件,您会看到:
This is a String

在一些文件中有很多杂乱的内容。

对于大多数情况来说这是可以接受的,但是当涉及到像API密钥这样敏感的信息时就不行了。

当然,一个替代方案是从另一个文件中读取API密钥,但这只会让密钥更容易被找到,因为现在使用者可以在打开.jar文件时直接打开“key.txt”。

那么如何在你的.class文件中加密字符串?


1
最方便的方法是从您的代码中删除任何敏感信息,并将其存储在某种(可能加密的)存储库中。 - Jonathan
我有同样的问题 - 当我反编译其他应用程序(Android apk)时,第一件要搜索的是实际上导致反向工程apk并理解已反编译的代码。 - Marian Paździoch
4个回答

6

当你向第三方发送代码时,你失去了对它的所有控制。即使你将API密钥嵌入为加密字符串,攻击者仍然可以尝试并有可能成功地破解它,这将使你所有的加密/解密努力都白费。

在我看来,最好的解决方案是不在应用程序中提供任何敏感信息,而是提供一个类似于ID的标识。它需要的任何敏感值都将通过使用安全连接进行提取。


4
如果您使用一个密钥来访问第三方 API,如果您将其随应用程序代码一起发布,或者想让您的应用程序在没有中间人的情况下访问第三方 API,那么将无法保护该密钥免受最终用户的攻击。
最终用户可以阅读您的应用程序发送到终点的所有数据并获知 API 密钥。无论您采取什么措施对其进行加密,您都需要至少一次解密密钥并将其发送给第三方 API。
安全的方法是要求用户登录您提供的服务,向“您”的服务发送请求,然后“您”的服务(假设不位于最终用户的计算机上)向 API 发送请求以获取密钥。因此,最终用户永远不会知道密钥。

1
如果您将信息存储在类文件中,解密密钥应该来自类外部。您可以加密数据,但是如果您拥有所有信息“在类文件中”,那么您就会迷失方向。
您应该将API密钥存储在配置文件中。开发和实际使用的API密钥不同,对吗?
另一个可能的解决方案是使用KeyStore,它允许您以公开可访问的格式存储敏感信息。只有秘密密钥的持有者才能解密敏感数据。

目前我的应用程序还未被Riot批准,因此我没有发布密钥。但是,即使有了当前的API密钥,也无法处理大规模使用。:P不管怎样,当用户在计算机上运行它时,API密钥和加密密钥都将以相同的.jar文件形式存在,即使它们在jar文件中的不同文件中。 - CSDragon

0
即使您将该信息加密在类中,黑客也可以从您的代码中找到解密机制。因此,在我看来,最好将加密信息保存在其他文件中,并读取该文件。此外,使用操作系统安全机制限制对该文件的访问。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接