Java 安卓应用中密钥的反黑客解决方案?

Java 安卓应用中密钥的反黑客解决方案?,java,android,reverse-engineering,secret-key,Java,Android,Reverse Engineering,Secret Key,我需要在应用程序中存储一个私有字符串密钥。其值永远不会更改,并在代码中手动设置。很明显,我不能将其存储为字符串,因为逆向工程方法会揭示它,即使应用了模糊处理 您建议我如何保护此私钥 我想把它保存到数据库中,但数据库也可以从手机中取出 另外,这个键是一个特殊的参数,所以它是一个重要的方法,至关重要的是任何人都不知道它!这不是解密密钥。此字符串将用作加密方法(md5或类似方法)的参数,然后将结果发送到我们的Internet服务 编辑 对不起,把事情弄得这么复杂。我想我可以用尽可能少的信息得到答案 该

我需要在应用程序中存储一个私有字符串密钥。其值永远不会更改,并在代码中手动设置。很明显,我不能将其存储为
字符串
,因为逆向工程方法会揭示它,即使应用了模糊处理

您建议我如何保护此私钥

我想把它保存到数据库中,但数据库也可以从手机中取出


另外,这个键是一个特殊的参数,所以它是一个重要的方法,至关重要的是任何人都不知道它!这不是解密密钥。此字符串将用作加密方法(md5或类似方法)的参数,然后将结果发送到我们的Internet服务

编辑

对不起,把事情弄得这么复杂。我想我可以用尽可能少的信息得到答案

该应用程序将允许用户向互联网服务发送一些文本,然后互联网服务将这些文本发布到网站。我们需要确保文本通过安卓手机发送,因为任何网络机器人脚本都可以模仿安卓手机并发布垃圾邮件。由于类似captcha的方法在手机上不受欢迎,因此将有一个密钥通过md5(以及其他一些东西)生成哈希代码。此哈希将被发送到Internet服务。互联网服务将使用相同的密钥获得md5结果,然后比较它,看看发送者是移动电话还是机器人


这真是我能说的最大限度了。我希望这足够了

我建议您重新考虑您的安全架构。应用程序附带的任何内容都是可发现的。(例如,Android的许可证验证库的设计是为了在应用程序中附带公钥。)

一种可能性是应用程序从服务器检索密钥(通过安全套接字或https连接)。这显然需要应用程序向服务器提交某种标识/验证(可能基于用户输入)


如果您使用密钥进行加密,那么再看看公钥加密应该如何工作。你的应用程序应该有公钥;然后,互联网服务可以使用匹配的私钥进行解密。

如果你能接受@Adam的评论,我知道至少有一种解决方案可以在手机上以。。。好。。。持久方式,这意味着该值将在卸载/重新安装应用程序后继续存在(但出厂重置会将其删除),但对用户而言仍然是“隐藏”的(即存储在系统专用存储中,而不是存储在SD卡上)

您可以使用系统设置内容提供程序存储值,如下所示:

final String myKey = "verySecretKey";
final String myValue = "verySecretValue";
final boolean isSuccess = System.putString(getContentResolver(), myKey, myValue);
要检索它,您可以执行以下操作:

myValue = System.getString(getContentResolver(), myKey);

是的,在根手机上,方便的用户可能会获得持久值,但在这种情况下,任何东西都不再神圣,@Adam的评论都会变得有效:你不应该将数据存储在设备上。

“重要的是,任何人都不知道它”如果真的很重要,你根本不能将其包含在应用程序中。否则,攻击者可以使用调试器单步执行代码,在代码使用字符串时停止,然后检查内容。攻击者不需要知道如何解密字符串,只需安装Android dev工具,即可让您的代码进行解密。@AdamMihalcin否,此字符串将用于加密,然后将结果发送到其他Internet服务。这会改变什么吗?我同意,如果你像pswd/TAN或类似的方式使用你的字符串,你可能希望通过向手机发送一次性使用代码来研究银行现在的做法,然后使用它——每次用户想要访问时,他都会得到一个新的@亚当·米哈尔辛,你到底是什么意思?我知道人们可能会看代码,但是,在调试加载的应用程序时,这怎么可能?@AdamMihalcin再次编辑了答案。@user387184再次编辑了答案。嗨,Ted,我已经编辑了问题。“此字符串将用作加密方法(md5或类似方法)的参数,然后结果将发送到我们的Internet服务。”@sandalone-听起来您应该从服务器中提取哈希密钥。用户可以通过电话输入凭据,以便服务器在颁发密钥之前进行验证。你可以想象一下:散列密钥可以基于手机生成的随机数,并随凭据一起提交。是的,我根据你的建议提出了类似的解决方案。谢谢这真的有效吗?这看起来像是一种黑客行为,而且是Android不允许的(或者可能在未来的版本中被破解)。设置。系统用于。。。好的,是系统设置,而不是应用程序个人存储。是的,它能工作,我也希望它能工作,特别是因为它有一个公开的API文档。此外,检查文档(),您可能会注意到,
putString
方法似乎启用了“通用键值存储”,而其他
put…
方法似乎主要用于修改现有键(但这可能是一个解释问题)。