Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用软件/硬件支持的Android密钥库以及可能存在的安全性/可用性缺陷_Android_Security_Android Keystore - Fatal编程技术网

使用软件/硬件支持的Android密钥库以及可能存在的安全性/可用性缺陷

使用软件/硬件支持的Android密钥库以及可能存在的安全性/可用性缺陷,android,security,android-keystore,Android,Security,Android Keystore,我目前正在研究在Android应用程序中存储/使用密钥的可能性。我发现这一主题非常有用,并且我已经了解了很多关于Android密钥库和一些基于硬件的实现的内容 我仍然有一些关于安全性和用户体验方面的问题 软件密钥库 据我所知,在这种配置中,主密钥(使用PBKDF2)是从用户密码(加上防止rainbow表攻击的salt)派生出来的,用于加密机密。据我所知,密码是用于锁屏的密码 在非根目录电话上,只有用户“keystore”能够读取/写入加密文件,并且每当应用程序想要访问文件时,它必须调用keyst

我目前正在研究在Android应用程序中存储/使用密钥的可能性。我发现这一主题非常有用,并且我已经了解了很多关于Android密钥库和一些基于硬件的实现的内容

我仍然有一些关于安全性和用户体验方面的问题

软件密钥库 据我所知,在这种配置中,主密钥(使用PBKDF2)是从用户密码(加上防止rainbow表攻击的salt)派生出来的,用于加密机密。据我所知,密码是用于锁屏的密码

在非根目录电话上,只有用户“keystore”能够读取/写入加密文件,并且每当应用程序想要访问文件时,它必须调用keystore守护程序,该守护程序检查其UID是否有权访问该文件(授权存储在sqlite数据库中)

但仍有一些细节我无法理解:

  • 使用密钥库是否强制使用密码保护的锁屏
  • 每次需要访问加密密钥时,用户是否必须输入其密码
  • 考虑到它是一种只使用软件的机制,我认为无论何时用于加密操作,密钥都会在RAM中解密,对吗
基于硬件的密钥库 至于基于硬件的实现,SoC制造商似乎提供了符合
[Global Platform TEE][2]
(可信执行环境)的解决方案,这些解决方案具有嵌入式可信应用程序和API,使谷歌能够提供其密钥库的硬件支持实现。因此,可以将密钥存储在TEE中,请求在TEE中创建RSA密钥对,并使用存储在TEE中的密钥对数据进行签名或检查。这样,就可以使用密钥进行基本的加密操作,而不必离开TEE

如果我没有弄错的话,对这些密钥的访问控制是由googlekeystore守护进程使用与软件实现中相同的机制提供的。唯一的区别是使用了对存储在TEE中的密钥的引用,而不是加密密钥本身

如果前面所述的一切都是正确的,我想在根手机上修改权限数据库是可能的,这样具有任意UID的应用程序就可以使用存储在TEE中的任何密钥对数据进行签名。我说得对吗

谢谢你的时间

  • 使用密钥库是否强制使用受密码保护的锁 屏幕
是的,用户被迫使用锁屏,受密码、pin或图案保护

  • 用户是否必须在每次访问时输入其密码 需要加密密钥吗
不,一旦设备解锁,密钥库也将解锁,无需输入其他密码。但是,应用程序应该检查密钥库是否已解锁,因为用户可以在设置中禁用锁屏保护。一旦密钥锁定被禁用,密钥存储将变得未初始化,必须再次解锁。有几次,当密钥存储被锁定时,我遇到了一种奇怪的行为,但我没有设置锁屏保护。系统提示我输入密码或pin码以进入密钥库。然而,这是不可能的,因为我没有任何密码。我猜一些系统应用程序正在锁定密钥库。我必须重置它以重新初始化

  • 考虑到这是一种仅限于软件的机制,我认为一个秘密密钥将 每次用于加密时,总是在RAM中解密 行动,对吗
是的,所有从密钥库检索到的密钥都将驻留在RAM中,直到垃圾被收集或取消初始化。但是,您可以在每次需要时获得密钥,而不是将其保存在某个长期变量中


不幸的是,我不熟悉硬件支持的密钥库。无法对此发表任何意见。

您对基于TEE的硬件支持方案的分析是正确的。TEE中生成的私钥位(不一定符合全球平台规范)永远不会离开TEE,私钥操作在TEE中执行


基于TEE的密钥的句柄存储在密钥库中,这样root用户就可以访问和使用其中任何一个密钥,或者移动它们以便任何应用程序都可以使用它们。模式是否经过授权?我认为搜索空间太小,无法抵抗暴力攻击。关于密钥库解锁,我可能在这里遗漏了一些东西,但它涉及到只要设备解锁,主密钥就会以某种方式不加密地驻留在RAM中,不是吗?你是错的,除非使用
setEncryptionRequired()
,否则使用
keystore
不会强制使用锁屏。请看上面的链接(由Dori提供)对我不起作用。这里是一个修改后的链接。顺便说一下,这篇文章不错@Dori事情会随着时间的推移而变化,如果某件事情现在起作用,并不意味着它总是这样。@AlexanderZhak是的,我知道API会随着时间的推移而变化。不知道你是否读过我链接的文章,这篇文章展示了这个特定的API自诞生以来是如何变化的