我使用KeyStore(Android 9)生成AES密钥,并使用isInsideSecureHardware()方法检查密钥 isInsideSecureHardware 。我得到了返回 False 。可以找到示例代码here和here。
布尔布尔值isInsideSecureHardware()
如果密钥位于安全硬件(例如,受信任的执行环境(TEE)或安全元素(SE))内部,则返回true。此类密钥的密钥材料仅在安全硬件内部以明文形式提供,而不会在外部暴露。
因此,我想进一步确认我的电话设备(华为P20)是否支持TEE。
问题:
如果电话支持TEE,那么KeyStore生成的密钥会自动存储到TEE中吗?我需要在Java中进行任何手动配置吗?我听说只要您使用 KeyStore.getInstance() , KeyGenerator,密钥将自动存储在TEE中 .getInstance(算法,密钥库名称) 。但是我不确定这是对还是错?
如果问题1的答案是“需要手动配置”,则成为 isInsideSecureHardware ()返回 False 的原因了吧?如果Q1的答案是“自动”,请忽略Q2。
有什么方法可以直接检查电话是否支持Java中的TEE?
答案 0 :(得分:2)
安装了运行Android 9(API级别28)或更高版本的受支持设备可以具有StrongBox Keymaster,StrongBox Keymaster是位于硬件安全模块中的Keymaster HAL的实现。该模块包含以下内容:
[...]
*安全存储。
[...]
在检查存储在StrongBox Keymaster中的密钥时,系统会通过可信执行环境(TEE)确认密钥的完整性。
[...]
使用KeyStore类生成或导入密钥时,通过将true传递给setIsStrongBoxBacked()方法,可以指示将密钥存储在StrongBox Keymaster中的方式。
据我所知,这意味着当您生成密钥并为密钥配置调用keyGenParameterSpecBuilder.setIsStrongBoxBacked(true)
时,可以确保它得到TEE
的支持。如果没有TEE
可用,它将抛出StrongBoxUnavailableException
。
因此,要检查是否有TEE
可用,您可以尝试以这种方式生成密钥并查看其是否有效。
答案 1 :(得分:1)
@JensV是正确的:如果在setIsStrongBoxBacked
上设置了keyGenParameterSpecBuilder
,则在不支持StrongBox的情况下,密钥生成将失败,并显示StrongBoxUnavailableException
。但是,在中间情况下-要识别TEE(即在安全硬件中生成并使用密钥),却不支持StrongBox-
通常,方法是在设备上实际生成密钥,然后执行HW key attestation on it at the server-查询已签名的密钥属性以检查硬件支持的确切程度:
setAttestationChallenge
构建器上调用KeyGenParameterSpec
并传递从服务器获得的随机数来请求硬件证明(请勿使用该设备上产生的随机数)< / li>
attestationChallenge
)attestationSecurityLevel
中的KeyDescription
SecurityLevel ::= ENUMERATED {
Software (0),
TrustedEnvironment (1),
StrongBox (2),
}
TrustedEnvironment
和StrongBox
都对应于硬件支持的密钥和加密操作。