鉴于无法使用Android KeyChain
API存储对称密钥,以下是存储对称密钥的安全方法:
第一部分:密钥生成和存储
symmetric_key
(private_key, public_key)
,将其存储在KeyChain
symmetric_key
加密public_key
,如下所示:encrypted_symmetric_key = public_encrypt(symmetric_key)
encrypted_symmetric_key
存储在本地存储空间(SharedPreferences
,SQLite
等)。 第二部分:使用symmetric_key
当应用想要加密/解密时:
private_key
KeyChain
加载到内存中
encrypted_symmetric_key
symmetric_key := private_decrypt(encrypted_symmetric_key)
encrypt(symmetric_key, some_message)
或decrypt(symmetric_key, some_ciphertext)
关注:
(private_key, public_key)
对?(private_key, public_key)
对的应用是唯一可以读取密钥对的用户吗?答案 0 :(得分:1)
根据文件(https://developer.android.com/reference/android/security/KeyChain.html): KeyChain类提供对凭证存储中私钥及其相应证书链的访问。
私钥意味着它是非对称的(私钥和公钥是非对称密钥的两个部分)。
在第1部分中,您将介绍在Android设备上存储对称密钥的首选方法。你的第2部分也是正确的(至少据我所知)。
至于你的顾虑 - 你也是对的。在有根设备上 - 存储在设备上的密钥容易受到攻击,并且可以由有权访问该设备的人获取。在非root设备上 - 只有应用程序才能访问它创建的密钥。
关于rooting - 您可以使用rootShell(https://github.com/Stericson/RootShell)之类的根检测库来检测设备是否已植根,然后采取相应措施(在该设备上禁用应用程序或类似的东西),您还应该查看Google的SafetyNet(https://developer.android.com/training/safetynet/index.html)以检测设备是否被篡改(它也检测到生根)。