我目前正在研究在Android应用程序中存储/使用机密密钥的可能性。我发现Nikolay Elenkov's blog对此主题非常有帮助,并且我已经了解了很多关于Android密钥库和一些基于硬件的实现的内容。
我仍然对安全性和用户体验方面有一些疑问。
根据我的理解,在此配置中,从用户密码(加上盐以防止彩虹表攻击)派生出一个masterkey(使用PBKDF2)并用于加密秘密。据我所知,密码是用于锁定屏幕的密码。
在非root手机上,只有用户的密钥库'能够读取/写入加密文件,并且每当应用程序想要访问文件时,它都必须调用密钥库守护程序,该守护程序检查其UID是否有权访问该文件(授权存储在sqlite数据库中)。 p>
但仍有一些细节我无法弄清楚:
对于基于硬件的实现,SoC制造商似乎提供符合[Global Platform TEE][2]
(可信执行环境)的解决方案,其中嵌入了受信任的应用程序和API,使Google能够提供其密钥库的硬件支持实现。因此可以在TEE中存储秘密密钥,在TEE内部请求创建RSA密钥对,并使用存储在TEE内的密钥来签名或检查数据。通过这种方式,可以使用密钥进行基本的加密操作,而无需离开TEE。
如果我做对了,那么Google密钥库守护程序使用与软件实现中相同的机制来提供对这些密钥的访问控制。唯一的区别是使用了对存储在TEE中的密钥的引用而不是加密密钥本身。
如果之前说明的所有内容都是正确的,我想在root用户手机上可以修改权限数据库,以便具有任意UID的应用程序可以使用存储在TEE中的任何密钥签名数据。我是对的吗?
谢谢你的时间!
答案 0 :(得分:4)
是的,用户被迫使用锁屏,用密码,图钉或图案保护。
不,一旦设备被取消,KeyStore也会解锁,无需输入其他密码。但是,应用程序应检查KeyStore是否已解锁,因为用户可以在“设置”中禁用锁定屏幕保护。一旦密钥锁定被禁用,KeyStore就会变得未初始化,必须再次解锁。
有几次我遇到了一个奇怪的行为,当KeyStore被锁定时,我没有设置锁屏保护。我被提示输入密码或密码以进入KeyStore。但是,这是不可能的,因为我没有任何密码。我假设一些系统应用程序锁定了KeyStore。我不得不重置它以重新初始化。
是的,从KeyStore检索的所有密钥都将驻留在RAM中,直到垃圾收集或取消初始化。但是你可以在每次需要时获得密钥,而不是将其保存在一些长期存在的变量中。
不幸的是,我不熟悉支持HW的KeyStore。不能说什么。
答案 1 :(得分:2)
您对基于TEE的硬件支持方案的分析是正确的。在TEE中生成的私钥位(不一定符合全球平台规范)永远不会离开TEE,私钥操作也在其中执行。
基于TEE的键的句柄存储在Keystore中也是正确的,因此root可以访问和使用它们中的任何一个,或者移动它们以便任何应用程序都可以使用它们。