我正在尝试加密用户指定的字符串列表。用于加密和解密此数据的AES密钥必须保存在设备上,以便在用户需要时可用于解密数据。我已经读过使用Keystore是存储密钥的一个很好的选择,但我读过的大多数指南都与签署你的应用程序有关,这不是我想要的。我的应用程序要求用户输入密码,然后使用密码解锁的密钥解密字符串数据。我该怎么做?
感谢。
答案 0 :(得分:2)
如果没有以精确的方式定义“安全”,很难回答您的问题。你在谈论与其他应用程序的安全性吗?对其他用户的安全性?安全防盗设备?还是防止损失?
此外,您在谈论什么级别的安全性?在给定密钥下加密的数据是否足够敏感以保证如何存储密钥?
据我了解,如果数据具有高度敏感性,您应该使用基于密码的密钥派生函数(如PBKDF#2,Bcrypt或Scrypt)直接从密码派生密钥。这样,密钥材料不需要直接存储在您的设备上。
如果您打算出于任何原因存储主加密密钥,请使用密码密钥进行加密,并将其作为Base64字符串存储在与MODE_PRIVATE
共享的SharedPreferences下,以保护其免受其他应用程序的攻击。即使密钥被恶意用户/设备盗窃恢复,没有正确的密码密钥,密钥材料本身也是无用的。
如果您想保护密钥免受丢失,则不应将密钥存储在设备上,而应存放在您自己的服务器上,再次使用密码密钥进行加密,这样数据库泄露也不会导致数据泄露。 / p>
总而言之,我建议您尽量不将任何类型的私钥存储到设备本身,而是使用密码派生密钥作为所有加密操作的主密钥。保留在公钥加密和已知公钥证书中生成的私钥的密钥库。