9

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

你建议我如何保护这个私钥?

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

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

编辑

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

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

这真的是我可以说的最大值。我希望这已经足够了。

4

2 回答 2

11

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

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

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

于 2012-04-18T06:36:18.090 回答
4

如果您可以接受@Adam 的评论,那么我知道至少有一个解决方案可以在手机上以......好吧......持久的方式持久保存字符串值,这意味着该值将在卸载/重新安装后继续存在您的应用程序(恢复出厂设置会删除它),但对用户仍然“隐藏”(即存储在系统私有存储中,而不是存储在 SD 卡上)。

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

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

要检索它,您可以执行以下操作:

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

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

于 2012-04-18T06:45:00.560 回答