我使用KeyStore (Android 9)生成AES密钥,并使用isInsideSecureHardware()方法检查密钥是否为KeyStore。我得到了返回False。示例代码可以找到这里和这里。
公共布尔isInsideSecureHardware () 如果密钥驻留在安全硬件中(例如,可信执行环境(TEE)或安全元素(SE)),则返回true。此类密钥的关键材料仅在安全硬件内部以明文形式提供,不在此之外公开。
因此,我想进一步确认我的手机设备(华为P20)是否支持TEE。
问题:
发布于 2020-04-15 10:02:14
来自Android密钥存储系统文档:
支持运行Android9(APILevel28)或更高版本的设备可以有一个StrongBox密钥母版,这是驻留在硬件安全模块中的Keymaster HAL的一个实现。该模块包含以下内容: ..。 *安全储存。 ..。 当检查存储在StrongBox密钥管理器中的密钥时,系统会通过可信的执行环境(TEE)来验证密钥的完整性。 ..。 在使用KeyStore类生成或导入密钥时,可以通过将true传递给setIsStrongBoxBacked()方法来指示将密钥存储在StrongBox密钥母版中的首选项。
根据我的理解,这意味着当您为密钥配置生成一个密钥并调用keyGenParameterSpecBuilder.setIsStrongBoxBacked(true)
时,您可以确保它是由一个TEE
支持的。如果没有可用的TEE
,它将抛出一个StrongBoxUnavailableException
。
因此,要检查是否有可用的TEE
,只需尝试以这种方式生成一个密钥,并查看它是否有效。
发布于 2020-10-19 06:16:02
@JensV是正确的:如果在setIsStrongBoxBacked
上设置keyGenParameterSpecBuilder
,如果不支持StrongBoxUnavailableException
,则密钥生成将失败。但是,中间的情况--有一个TEE (即在安全HW中生成和使用密钥),但不支持StrongBox --更难分辨。
通常,方法是在设备上实际生成一个密钥,然后执行在服务器上的HW密钥认证 --查阅已签名的密钥属性,以检查HW支持的确切程度:
setAttestationChallenge
构建器上调用KeyGenParameterSpec
并传入从服务器获得的值来请求HW认证(不要使用在设备上产生的nonce )attestationChallenge
)attestationSecurityLevel
of KeyDescription
SecurityLevel ::= ENUMERATED {
Software (0),
TrustedEnvironment (1),
StrongBox (2),
}
TrustedEnvironment
和StrongBox
都与硬件支持的密钥和密码操作相对应.
https://stackoverflow.com/questions/61225795
复制相似问题