在Android设备上安全隐藏字符串

时间:2016-01-27 22:05:25

标签: android security android-security

问题: 我需要在设备上本地存储一个SECRET密钥(String)。我如何合理地做到这一点?

不可能将100%安全的东西保存在本地存储,但我想让某人尽可能难以提取密钥。我有什么选择?

要求

  • 不应涉及任何UI操作。
  • 秘密密钥不应该以微不足道的方式提取。

可能的解决方案

4 个答案:

答案 0 :(得分:1)

您现在可以使用新的gradle插件+库来有效地混淆类中的字符串,请在此处查看

https://github.com/MichaelRocks/paranoid

现在还有一个新的插件可以混淆资源,请在下面查看

https://github.com/shwenzhang/AndResGuard

帮助分享和提升这些重要信息,以便更多的开发人员可以使用它,因此越来越多的开发人员将为这些插件的进一步开发做出贡献,因此我们可以共同改进这些插件,并为破解者带来噩梦。 / p>

答案 1 :(得分:0)

您可以在SharedPreferences上添加一层加密,并在其中存储任何密钥。

我在其中一个应用中使用了这些作为参考,对你的情况也应该有所帮助。

第一个链接:http://right-handed-monkey.blogspot.com/2014/04/obscured-shared-preferences-for-android.html

第二个链接:What is the most appropriate way to store user settings in Android application

答案 2 :(得分:0)

如果不涉及UI交互,您可以做的最好的事情就是使用您在应用中硬编码的密钥加密所有数据(或使用您的应用中将硬编码的密码的证书)。

你唯一可以做的就是试图掩盖那把钥匙。

您可以使用ProGuard或类似的东西来混淆Java代码,但这仍然非常容易检查,并且可以轻松提取密钥。

为了对代码进行更多的混淆,您可以将密钥插入C代码并通过自己的JNI接口进行加密/解密。这将为您提供现在可以获得的最佳效果。

答案 3 :(得分:0)

如果攻击者可以下载APK,使其可调试(这意味着重新签名)并使用ADB对其进行破解,则您尝试的所有操作都会失败。无论使用哪种混淆方式,都可能以某种方式将密钥传递给框架API,这就是攻击者将注意的地方。如果您需要保留一个秘密,请使用AndroidKeyStore生成它,这样就不会提取该秘密(除非没有硬件支持)。基本上,您的对手可以完全控制其扎根的电话,一旦您将秘密与APK一起发送,该秘密就会丢失。

一种解决方案:在硬件支持的Android KeyStore wrapping key中创建generate a key attestation对,获取后端以验证密钥证明,加密您的秘密,然后将其以包装形式发送到设备。

不幸的是,这仅适用于Android P设备。