使用软件/硬件支持的Android密钥库以及可能存在的安全性/可用性缺陷
我目前正在研究在Android应用程序中存储/使用密钥的可能性。我发现这一主题非常有用,并且我已经了解了很多关于Android密钥库和一些基于硬件的实现的内容 我仍然有一些关于安全性和用户体验方面的问题 软件密钥库 据我所知,在这种配置中,主密钥(使用PBKDF2)是从用户密码(加上防止rainbow表攻击的salt)派生出来的,用于加密机密。据我所知,密码是用于锁屏的密码 在非根目录电话上,只有用户“keystore”能够读取/写入加密文件,并且每当应用程序想要访问文件时,它必须调用keystore守护程序,该守护程序检查其UID是否有权访问该文件(授权存储在sqlite数据库中) 但仍有一些细节我无法理解:使用软件/硬件支持的Android密钥库以及可能存在的安全性/可用性缺陷,android,security,android-keystore,Android,Security,Android Keystore,我目前正在研究在Android应用程序中存储/使用密钥的可能性。我发现这一主题非常有用,并且我已经了解了很多关于Android密钥库和一些基于硬件的实现的内容 我仍然有一些关于安全性和用户体验方面的问题 软件密钥库 据我所知,在这种配置中,主密钥(使用PBKDF2)是从用户密码(加上防止rainbow表攻击的salt)派生出来的,用于加密机密。据我所知,密码是用于锁屏的密码 在非根目录电话上,只有用户“keystore”能够读取/写入加密文件,并且每当应用程序想要访问文件时,它必须调用keyst
- 使用密钥库是否强制使用密码保护的锁屏
- 每次需要访问加密密钥时,用户是否必须输入其密码
- 考虑到它是一种只使用软件的机制,我认为无论何时用于加密操作,密钥都会在RAM中解密,对吗
[Global Platform TEE][2]
(可信执行环境)的解决方案,这些解决方案具有嵌入式可信应用程序和API,使谷歌能够提供其密钥库的硬件支持实现。因此,可以将密钥存储在TEE中,请求在TEE中创建RSA密钥对,并使用存储在TEE中的密钥对数据进行签名或检查。这样,就可以使用密钥进行基本的加密操作,而不必离开TEE
如果我没有弄错的话,对这些密钥的访问控制是由googlekeystore守护进程使用与软件实现中相同的机制提供的。唯一的区别是使用了对存储在TEE中的密钥的引用,而不是加密密钥本身
如果前面所述的一切都是正确的,我想在根手机上修改权限数据库是可能的,这样具有任意UID的应用程序就可以使用存储在TEE中的任何密钥对数据进行签名。我说得对吗
谢谢你的时间 - 使用密钥库是否强制使用受密码保护的锁 屏幕
- 用户是否必须在每次访问时输入其密码 需要加密密钥吗
- 考虑到这是一种仅限于软件的机制,我认为一个秘密密钥将 每次用于加密时,总是在RAM中解密 行动,对吗
不幸的是,我不熟悉硬件支持的密钥库。无法对此发表任何意见。您对基于TEE的硬件支持方案的分析是正确的。TEE中生成的私钥位(不一定符合全球平台规范)永远不会离开TEE,私钥操作在TEE中执行
基于TEE的密钥的句柄存储在密钥库中,这样root用户就可以访问和使用其中任何一个密钥,或者移动它们以便任何应用程序都可以使用它们。模式是否经过授权?我认为搜索空间太小,无法抵抗暴力攻击。关于密钥库解锁,我可能在这里遗漏了一些东西,但它涉及到只要设备解锁,主密钥就会以某种方式不加密地驻留在RAM中,不是吗?你是错的,除非使用
setEncryptionRequired()
,否则使用keystore
不会强制使用锁屏。请看上面的链接(由Dori提供)对我不起作用。这里是一个修改后的链接。顺便说一下,这篇文章不错@Dori事情会随着时间的推移而变化,如果某件事情现在起作用,并不意味着它总是这样。@AlexanderZhak是的,我知道API会随着时间的推移而变化。不知道你是否读过我链接的文章,这篇文章展示了这个特定的API自诞生以来是如何变化的