【问题标题】:Encrypt data with Android Keystore and user provided secret使用 Android Keystore 和用户提供的密钥加密数据
【发布时间】:2019-08-10 23:49:12
【问题描述】:

我想使用硬件 Android 密钥库来安全地加密敏感数据并将其本地存储在设备上。标准实现看起来很简单,并且有足够多的教程来说明如何实现它。

但我得到的要求要求用户提供的机密(用户必须输入的用户密码或密码)包含在敏感数据的加密中。因此,数据的加密/解密仅适用于已知的用户秘密,而不是没有它。

我还没有找到向 Android Keystore 进程提供用户密码的方法。

如何使用 Android Keystore 加密/解密需要用户秘密输入才能实际工作的数据?

【问题讨论】:

  • 您可以使用密钥库对密码的一部分进行加密以进行另一轮加密,其中用户提供的秘密构成密码的另一部分。组合密码可用于 SQLCipher for Android。
  • 您的意思是在设备上创建一个随机密码短语,您将使用密钥库的力量来保护它(通过使用密钥库密钥对其进行加密来保持它)并将其与由提供的用户结合类似于 SecretKeyFactory 的 PBKDF2?然后使用我们使用 PBKDF2 生成的密钥来实际加密/解密我们的敏感数据?
  • “你的意思是在设备上创建一个随机密码短语,你会用密钥库的力量来保护它(通过使用密钥库密钥对其进行加密来保持它)”——是的。 “他们将其与由 PBKDF2 之类的东西提供的用户结合起来”——您是否需要像 PBKDF2 轮次那样的密钥拉伸取决于将使用组合密钥的内容。例如,适用于 Android 的 SQLCipher 已经进行了自己的 PBKDF2 轮次,因此您不需要自己添加更多轮次。 “然后用那个密钥……真正加密/解密我们的敏感数据?” -- 是的。
  • 非常感谢您的帮助

标签: android security android-keystore


【解决方案1】:

AndroidKeyStore 不提供任何 API 来为生成的密钥设置用户提供的密码。您唯一能做的就是将KeyGenParameterSpec.Builder#setUserAuthenticationRequired 标志设置为true 以用于系统提供的用户身份验证(pin/pattern/指纹等)

AndroidKeyStore 的真正力量来自 TEE 和安全硬件。因此,任何其他选项,而不是直接在AndroidKeyStore 中使用密钥都应该被视为不太安全。因此,使用用户提供的密钥和密钥存储加密的密钥生成 PBKDF2 不会使您的加密更加安全。因为,该新密钥应该在应用程序内存中进行管理,并且在您完成加密并擦除所有密钥字节之前是易受攻击的(当然在受感染的设备中)。

但在安全硬件中,AndroidKeyStore 甚至不会将您的密钥加载到内存中。每个操作都在单独的安全硬件中进行。

如果您的要求不是严格“拥有一个密钥”和“只加密一次数据”,您可以考虑使用来自AndroidKeyStore 的密钥和从用户密码派生的用户密钥对您的数据进行两次加密。

此外,您可能还想阅读这篇论文:http://www.cs.ru.nl/~joeri/papers/spsm14.pdf。在本文中,作者还提到了使用用户提供密码的 Bouncy Castle 密钥库。

【讨论】:

  • 显然使用AndroidKeyStore 的缺点不是您的密钥不安全,而是可以使用名为Frida 的工具包检查您正在加密的值。如果您对代码库有足够的了解,则可以找到该值的使用位置并访问解密后的值。
猜你喜欢
  • 1970-01-01
  • 2019-01-13
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
相关资源
最近更新 更多