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