1

问题: 我需要在设备本地存储一个秘密密钥(字符串)。我该如何合理地做到这一点?

保持本地存储的 100% 安全私密的东西是不可能的,但我想让某人尽可能难以提取密钥。我有哪些选择?

要求

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

可能的解决方案

4

4 回答 4

2

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

https://github.com/MichaelRocks/paranoid

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

https://github.com/shwenzhang/AndResGuard

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

于 2018-06-05T06:14:57.247 回答
0

在不涉及 UI 交互的情况下,您能做的最好的事情是使用您将在应用程序中硬编码的密钥(或使用您将在应用程序中硬编码其密码短语的证书)加密所有数据。

那么你唯一能做的就是试图隐藏那个键。

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

为了进一步混淆代码,您可以在 C 代码中插入您的密钥,并通过您自己的 JNI 接口进行加密/解密。这将为您提供您现在可以得到的最好的。

于 2016-01-27T22:24:35.890 回答
0

如果攻击者可以下载您的 APK、使其可调试(这意味着重新签名)并使用 ADB 破解它,那么您可能尝试的一切都会失败。无论您使用何种混淆方式,您都可能以某种方式将密钥传递给框架 API,而这正是攻击者所关注的地方。如果您需要保密,请使用 AndroidKeyStore 生成它,这样就无法提取秘密(除非没有硬件支持)。基本上你的对手可以完全控制他们的手机,只要你用 APK 发送秘密,这个秘密就会丢失。

一种解决方案:在硬件支持的 Android KeyStore 中创建一个封装密钥对,生成密钥证明,让您的后端验证密钥证明,加密您的密钥,然后以封装形式将其发送到设备。

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

于 2018-10-03T14:43:54.150 回答
0

You can put a layer of encryption over your SharedPreferences and store any secret key(s) there itself.

I used these as references in one of my apps and should be helpful in your case too.

First link: http://right-handed-monkey.blogspot.com/2014/04/obscured-shared-preferences-for-android.html

Second link: What is the most appropriate way to store user settings in Android application

于 2016-01-27T22:16:16.433 回答