我想使用硬件Android密钥库来安全加密敏感数据并将其本地存储在设备上。标准实现似乎非常容易,并且那里有足够的有关如何实现它的教程。
但是我得到的要求是,用户提供的秘密(用户必须输入的用户密码)必须包含在敏感数据的加密中。因此,数据的加密/解密仅适用于已知的用户机密,而不能没有已知的用户机密。
我还没有找到向Android Keystore进程提供用户密码的方法。
我该如何使用需要秘密用户输入才能正常工作的Android Keystore加密/解密数据?
答案 0 :(得分:2)
AndroidKeyStore
不提供任何API来为生成的机密设置用户提供的密码。唯一可以做的就是将KeyGenParameterSpec.Builder#setUserAuthenticationRequired标志设置为true
,以进行系统提供的用户身份验证(密码/图案/指纹等。)
AndroidKeyStore
的真正力量来自TEE和安全硬件。因此,任何其他选择(而不是直接在AndroidKeyStore
中使用密钥)都应被视为不太安全。因此,使用用户提供的密钥和密钥存储区加密的密钥生成PBKDF2不会使您的加密更加安全。因为,该新密钥应在应用程序内存中进行管理,并且在完成加密并擦除所有密钥字节之前,该密钥很容易受到攻击(当然在受感染的设备中)。
但是在安全的硬件中,AndroidKeyStore
甚至不会将密钥加载到内存中。每个操作都在单独的安全硬件中进行。
如果您的要求不是严格的“拥有一个密钥”和“仅加密一次”,则可以考虑使用AndroidKeyStore
的机密和从用户密码派生的用户密钥对数据进行两次加密
而且,您可能需要阅读这篇论文:http://www.cs.ru.nl/~joeri/papers/spsm14.pdf。在本文中,作者还提到了带有用户提供的密码的Bouncy Castle密钥库。