背景
根据一篇新的 Android 开发者博客文章(可在此处获得),您应该使用一种新技术来加密和解密存储在数据库或 sharedPreferences 中的敏感数据(例如密码),这样即使具有 root 权限的人也可以很难读。
新方法是:
public static SecretKey generateKey() throws NoSuchAlgorithmException {
// Generate a 256-bit key
final int outputKeyLength = 256;
SecureRandom secureRandom = new SecureRandom();
// Do *not* seed secureRandom! Automatically seeded from system entropy.
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(outputKeyLength, secureRandom);
SecretKey key = keyGenerator.generateKey();
return key;
}
问题
根据文章(以及我尝试过的内容),此代码每次调用它时都会创建一个新的不同键,所以我对此事有一些疑问:
应用程序会为旧版本的 Android 做什么?
此类应用程序将如何处理将 android OS 更新为它应该工作的新方式(API post 17 到 API 17)?
由于它不是确定性的,这意味着解密不能重新创建相同的密钥,那么这是否意味着密钥也被存储以便将其用于解密(以及以后的加密)?这样的事情不会错过重点吗?
假设我有代码生成的密钥,我将如何使用它来加密和解密来自 DB 和 sharedPreferences 的数据?
在文章中,他们说:
事实上,Android 现有的安全模型已经为这类数据提供了充足的保护。用户凭据应与设置的 MODE_PRIVATE 标志一起存储并存储在内部存储中
这是什么意思?不需要整个密钥生成,因为 Android 已经加密了所有内容?我的设备是 root 的,我可以轻松地说数据从未加密并且易于阅读(尤其是只是 xml 的 sharedPreferences)。