<分区>
背景
根据一篇新的 Android 开发人员博客文章(可用 here),您应该使用一种新技术来加密和解密存储在数据库或 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;
}
问题
根据这篇文章(以及我的尝试),这段代码会在您每次调用它时创建一个新的不同 key ,因此我对此事有一些疑问:
应用程序可以为旧版 Android 做什么?
此类应用如何处理将 Android 操作系统更新到它应有的新工作方式(API post 17 到 API 17)?
由于它不是确定性的,这意味着解密无法重新创建相同的 key ,那么是否意味着还存储了该 key 以便将其用于解密(以及以后的加密)?这样的事情不会错过重点吗?
假设我有代码生成的 key ,我将如何使用它来加密和解密来自数据库和 sharedPreferences 的数据?
在文章中,他们说:
The fact is, Android's existing security model already provides plenty of protection for this kind of data. User credentials should be stored with the MODE_PRIVATE flag set and stored in internal storage
这是什么意思?不需要整个 key 生成,因为 Android 已经加密了所有内容?我的设备已获得 root 权限,我可以轻松地说数据从未加密并且易于阅读(尤其是 sharedPreferences,它只是 xml)。