使用 Android 密钥库和用户提供的密钥加密数据

Encrypt data with Android Keystore and user provided secret

我想使用硬件 Android 密钥库来安全地加密敏感数据并将其存储在本地设备上。标准实施似乎非常简单,并且有足够多的教程介绍如何实施它。

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

我还没有找到向 Android 密钥库进程提供用户机密的方法。

如何使用 Android 需要秘密用户输入才能实际工作的密钥库 encrypt/decrypt 数据?

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

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

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

如果您的要求不是严格的 "having one key" 和 "encrypt data only once",您可以考虑使用来自 AndroidKeyStore 的秘密和从用户派生的用户密钥对您的数据进行两次加密密码。

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