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

时间:2015-02-17 16:31:06

标签: android keystore android-keystore

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

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

  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存储在本地存储空间(SharedPreferencesSQLite等)。
  5. 第二部分:使用symmetric_key

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

    1. private_key
    2. KeyChain加载到内存中
    3. 从磁盘加载encrypted_symmetric_key
    4. 获得symmetric_key := private_decrypt(encrypted_symmetric_key)
    5. encrypt(symmetric_key, some_message)decrypt(symmetric_key, some_ciphertext)
    6. 关注:

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

1 个答案:

答案 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)以检测设备是否被篡改(它也检测到生根)。