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

Posted

技术标签:

【中文标题】Android 应用中密钥的反黑客解决方案?【英文标题】:Anti-hack solution for a secret key in Android app? 【发布时间】:2012-04-29 12:59:09 【问题描述】:

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

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

我虽然是存入数据库,但也可以从手机中取出数据库。

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

编辑

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

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

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

【问题讨论】:

“至关重要的是,任何人都不知道它”如果它真的很重要,您根本不能将它包含在应用程序中。否则,攻击者可以使用调试器单步执行您的代码,在您的代码使用该字符串时停止,然后检查内容。攻击者不需要知道如何解密字符串,只需要安装 Android 开发工具就可以让您的代码进行解密。 @AdamMihalcin 不,此字符串将用于加密,然后将结果发送到其他 Internet 服务。这有什么改变吗? 我同意,如果您使用 pswd/TAN 或类似的字符串,您可能想通过向手机发送一次性使用代码并使用这 - 每次用户想要访问时,他都会获得一个新的。 @Adam Mihalcin,你到底是什么意思?我知道有人可能会看代码,但是,调试加载的应用程序,这怎么可能? @AdamMihalcin 再次编辑了答案。 @user387184 再次编辑答案。 【参考方案1】:

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

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

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

【讨论】:

嗨泰德,我已经编辑了这个问题。 "此字符串将用作加密方法(md5 或类似)的参数,然后将结果发送到我们的 Internet 服务。" @sandalone - 听起来您应该从服务器中提取散列密钥。用户可以通过手机输入凭据,供服务器在颁发密钥之前进行验证。您可以对此有所了解:哈希密钥可以基于手机生成的随机数并与凭据一起提交。 是的,我根据您的建议提出了类似的解决方案。谢谢!【参考方案2】:

如果您可以接受@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 的评论将变得有效:您不应该将数据存储在设备上。

【讨论】:

这真的有效吗?这似乎是一种 hack,并且是 Android 不允许的(或者可能会在未来的版本中破坏)。 Settings.System 用于...嗯,系统设置,而不是应用程序个人存储。 是的,它可以工作,我也希望它可以工作,特别是因为它有一个记录在案的公共 API。此外,查看文档 (developer.android.com/reference/android/provider/…),可能会注意到 putString 方法似乎已启用“通用键值存储”,而其他 put... 方法似乎用于主要修改现有的密钥(但这可能是一个解释问题)。

以上是关于Android 应用中密钥的反黑客解决方案?的主要内容,如果未能解决你的问题,请参考以下文章

保护 Android 应用免受逆向工程

进击的反爬机制

Android 插件化插件化技术弊端 ( 恶意插件化程序的解决方向 | 常用的插件化虚拟引擎 )

什么是nProtect?

在哪里存储我的密钥以加密移动设备上的数据?

Python Scrapy反爬虫常见解决方案(包含5种方法)