java - 将 AES key 安全地存储在 Android 设备中

标签 java android encryption cryptography

我正在尝试加密用户指定的字符串列表。用于加密和解密此数据的 AES key 必须保存在设备上,以便用户可以在需要时随时使用它来解密数据。我读过使用 Keystore 是存储 key 的一个很好的选择,但是我读过的大多数指南都将它与签署您的应用程序相关联,这并不是我想要的。我的应用程序要求用户输入密码,然后使用用密码解锁的 key 解密字符串数据。我该怎么做?

谢谢。

最佳答案

如果您不以精确的方式定义“安全”,就很难回答您的问题。您是在谈论针对其他应用程序的安全性吗?针对其他用户的安全性?防止设备被盗的安全性?还是防止丢失?

此外,您指的是什么级别的安全性?在给定 key 下加密的数据是否足够敏感以保证认真考虑如何存储 key ?

据我了解,如果数据具有高度敏感性,您应该使用基于密码的 key 派生函数(例如 PBKDF#2、Bcrypt 或 Scrypt)直接从密码派生 key 。这样, key Material 不需要直接存储在您的设备上。

如果您出于任何原因打算存储主加密 key ,请在密码 key 下加密并使用 MODE_PRIVATE 作为 Base64 字符串存储在 SharedPreferences 下,以保护它免受其他应用程序的侵害。即使 key 被恶意用户/设备盗窃恢复,如果没有正确的密码 key , key Material 本身也是无用的。

如果您想防止 key 丢失,您不应将 key 存储在设备上,而应存储在您自己的服务器上,再次使用密码 key 加密,这样数据库泄露就不会导致数据泄露。

总而言之,我建议您尽量不要将任何类型的私钥存储到设备本身,而是使用密码派生 key 作为所有加密操作的主 key 。保留在公钥加密和已知公钥证书中生成的私钥的 keystore 。

关于java - 将 AES key 安全地存储在 Android 设备中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28387350/

相关文章:

java - 为什么此代码会在 sleep 时导致 NPE 以避免 Twitter4J 中的速率限制?

android - cordova "release"在 SSL 方面的行为与 "debug"不同

java - 用Java压缩加密文件

php mcrypt 三元组的 python 等效项

java - 找不到类 com.immersion android 触觉

java - 以编程方式分配时 CardView.setRadius() 不起作用

android - 适用于 IO 但不适用于 Android 的自定义字体

添加 fragment 后,Android Studio 分解了我的 build.gradle 文件

encryption - 密码导出限制的现状如何?

java - 在 Linux 机器上配置 Java 7 中的站点异常(exception)列表