Android应用中的秘密密钥的反黑客解决方案?

我需要在应用程序内部存储一个私有字符串键。 它的值永远不会改变,并在代码中手动设置。 我显然不能将它作为String存储,因为反向工程方法会显示它,即使应用了混淆。

你怎么建议我保护这个私钥?

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

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

编辑

对不起,因为它太复杂了。 我想我可以用尽可能少的信息得到答案。

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

这实际上是我可以说的最大值。 我希望这就够了。

我建议您重新考虑您的安全架构。 随应用程序一起提供的任何内容都是可发现的。 (例如,Android的许可证validation库的设计使得应用程序附带了一个公钥。)

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

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

如果你能解决@Adam的评论,至少有一个我知道的解决方案,用于坚持手机上的字符串值…以…持久的方式,这意味着该值将在卸载/重新安装后继续存在您的应用程序(工厂重置会删除它),但仍然为用户“隐藏”(即存储在系统专用存储中,而不是存储在SD卡上)。

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

 final String myKey = "verySecretKey"; final String myValue = "verySecretValue"; final boolean isSuccess = System.putString(getContentResolver(), myKey, myValue); 

要检索它,您可以:

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

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