在Android KeyChain中安全地存储对称密钥

5
考虑到使用Android的KeyChain API无法存储对称密钥,以下方法是否安全?
第一部分:密钥生成和存储
1. 生成对称密钥symmetric_key 2. 生成(private_key, public_key)并将它们存储在KeyChain中 3. 使用public_key加密symmetric_key,如下所示:encrypted_symmetric_key = public_encrypt(symmetric_key) 4. 将encrypted_symmetric_key存储在本地存储(SharedPreferences、SQLite等)中
第二部分:使用symmetric_key
当应用程序想要加密/解密某些内容时:
1. 从KeyChain中加载private_key到内存中 2. 从磁盘加载encrypted_symmetric_key 3. 获取symmetric_key := private_decrypt(encrypted_symmetric_key) 4. encrypt(symmetric_key, some_message)或decrypt(symmetric_key, some_ciphertext)
担忧:
1. 是否有"已获取root权限的用户"能够获得(private_key, public_key)对? 2. 如果手机没有root权限,那么创建(private_key, public_key)对的应用程序是唯一能够读取密钥对的用户吗?

安全性取决于Android版本以及设备是否具有硬件或软件密钥库。 - Robert
1个回答

1
根据文档(https://developer.android.com/reference/android/security/KeyChain.html):KeyChain类提供对凭证存储中私钥及其相应证书链的访问。
私钥意味着它是非对称的(私钥和公钥是非对称密钥的两个部分)。
在第一部分中,您描述了在Android设备上存储对称密钥的首选方式。至少据我所知,第二部分也是正确的。
至于您的担忧 - 您也是正确的。在已root的设备上,存储在设备上的密钥是容易受到攻击的,可以被可以访问该设备的人获取。在未root的设备上,只有应用程序才能访问它创建的密钥。

关于root权限 - 你可以使用RootShell(https://github.com/Stericson/RootShell)等root检测库来检测设备是否已经root,然后根据情况采取相应措施(例如在该设备上禁用你的应用程序),同时你还应该了解谷歌的SafetyNet(https://developer.android.com/training/safetynet/index.html)来检测设备是否被篡改(它也会检测root权限)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接