【问题标题】:Android : If not hard-coded encryption key, where to save the encryption keyAndroid : 如果不是硬编码的加密密钥,保存加密密钥的位置
【发布时间】:2020-04-20 19:16:09
【问题描述】:
我的 android 应用程序有帐户、密码和其他重要信息需要存储在其数据库中。所以担心安全性,我现在正在研究加密这些数据以保存在数据库中,并在需要时再次解密。
使用盐和迭代可以使加密数据更加强大。这部分我明白怎么做。但是我在这里担心的是,有很多讨论不建议使用硬编码的 AES 密钥或 PBE 密钥。但是没有密钥,我无法再次解密数据(我确实需要再次解密)。
对于android应用程序保存密钥有什么好的建议吗?
非常感谢。
【问题讨论】:
标签:
android
encryption-symmetric
【解决方案1】:
建议使用 Android Keystore 管理加密密钥,这是设备端可用的最安全的方式来管理加密密钥。 Android Keystore 从可供用户应用程序使用的那一天起就经历了许多变化,这就是为什么我根据 API 级别对推荐的方法进行分类:
-
API 级别 Android 不支持 API 级别 17 的密钥库
及以下。对于 API 级别 17 及以下,建议
应用程序使用 PBKDF2(基于密码的密钥派生函数)
安全,以便应用程序在登录时(使用用户密码)在运行时生成加密密钥。加密密钥不应存储在设备中,并且应在需要时使用用户密码动态生成,因为设备中没有安全的地方来管理密钥。
API 级别 >=18 :Android 支持 API 级别 18 及以上的 Keystore。但是,对于 API 级别 22 及以下,对 AES 的支持
加密不可用。建议申请
使用默认加密提供程序生成随机 AES 密钥
并使用 RSA 公钥加密 AES 密钥,使用 Android 生成
通过 keyPairGenerator 的密钥库。一旦加密密钥被加密,它就可以存储在应用程序的私有数据存储中(例如:SharedPreferences)。当应用程序启动时,
AES 密钥可以使用 RSA 私钥解密。
API 级别 >=23: Android 支持 Keystore 和 API 的 AES 支持
23级及以上。我们可以使用直接生成随机 AES 密钥
generateKey API,同样由 Android 自动管理
密钥库。
【解决方案2】:
将您的数据保存在 .so 文件中。您需要在项目中实现 ndk 集成。这将使破解变得更加困难。你可以从 c++ 文件中取回你的价值。还要检查 c++ 中的包名称,以确保您的 so 文件没有在任何其他应用程序中使用。