使用Android KeyChain安全存储对称密钥

fer*_*hur 5 android keystore android-keystore

鉴于无法使用Android KeyChainAPI 存储对称密钥,以下是存储对称密钥的安全方法:

第一部分:密钥生成和存储

  1. 生成 symmetric_key
  2. 生成(private_key, public_key),存储它们KeyChain
  3. 加密symmetric_key使用public_key如下:encrypted_symmetric_key = public_encrypt(symmetric_key)
  4. 存储encrypted_symmetric_key在本地存储(SharedPreferences,SQLite,等)

第二部分:使用 symmetric_key

当应用程序想要加密/解密时:

  1. 将内容加载private_key到内存中KeyChain
  2. encrypted_symmetric_key从磁盘 加载
  3. 获得 symmetric_key := private_decrypt(encrypted_symmetric_key)
  4. encrypt(symmetric_key, some_message) 要么 decrypt(symmetric_key, some_ciphertext)

关注:

  1. 根的用户能够获得这(private_key, public_key)对吗?
  2. 如果手机没有root,那么创建该(private_key, public_key)对的应用程序是唯一可以读取密钥对的用户吗?

Fun*_*her 1

根据文档(https://developer.android.com/reference/android/security/KeyChain.html):KeyChain类提供对凭证存储中的私钥及其相应证书链的访问。

私钥意味着它是非对称的(私钥和公钥是非对称密钥的两个部分)。

在第 1 部分中,您描述了在 Android 设备上存储对称密钥的首选方式。你的第二部分也是正确的(至少据我所知)。

至于你的担忧——你也是对的。在获得 root 权限的设备上 - 存储在设备上的密钥容易受到攻击,并且可以由有权访问该设备的人获取。在非 root 设备上 - 只有应用程序才能访问它创建的密钥。

关于 root - 您可以使用 RootShell ( https://github.com/Stericson/RootShell ) 等 root 检测库来检测设备是否已 root,然后采取相应措施(在该设备上禁用您的应用程序或类似的东西)并且您还应该查看Google的SafetyNet(https://developer.android.com/training/safetynet/index.html)来检测设备是否被篡改(它也可以检测root)。