我读过这两篇文章:One and Two,但我还有疑问。
我使用 KeyStore (Android 9) 生成 AES 密钥,并使用isInsideSecureHardware()检查密钥是否存在的方法isInsideSecure硬件。我得到回报False。示例代码可以找到here, and here.
公共布尔 isInsideSecureHardware ()
如果密钥驻留在安全硬件(例如可信执行环境 (TEE) 或安全元件 (SE))内,则返回 true。此类密钥的密钥材料仅在安全硬件内部以明文形式提供,并且不会暴露在安全硬件外部。
因此,我想进一步确认我的手机设备(华为P20)是否支持TEE。
问题:
如果手机支持TEE,KeyStore生成的密钥会自动存储到TEE中吗?我需要在 Java 中进行任何手动配置吗?听说key会自动存储在TEE中,只要你使用KeyStore.getInstance(), 密钥生成器
.getInstance(算法, 密钥库名称)。但我不确定这是真的还是假的?
如果Q1的答案是“需要手动配置”,则成为原因isInsideSecure硬件() 返回False, 正确的?如果 Q1 的答案是“自动”,则忽略 Q2。
有什么方法可以在Java中直接检查手机是否支持TEE?
@JensV 是正确的:如果你设置setIsStrongBoxBacked
on the keyGenParameterSpecBuilder
,密钥生成将失败并显示StrongBoxUnavailableException
如果不支持 StrongBox。然而,中间情况 - 存在 TEE(即在安全硬件内生成和使用密钥),但不支持 StrongBox - 更难以辨别。
一般来说,方法是在设备上实际生成密钥,然后执行服务器上的硬件密钥认证- 查阅已签署的关键属性以检查硬件支持的确切程度:
- 在服务器上生成一个随机数(随机字节字符串),将其传递给设备
- 在设备上生成密钥,通过调用请求硬件证明
setAttestationChallenge
on the KeyGenParameterSpec
构建器并传入从服务器获得的随机数(请勿使用设备上生成的随机数)
- 从 Android 密钥存储请求密钥的证明链
- 将证明数据(证书链)传递到您的服务器
- 验证服务器上的证明(签名)链
- 确认根证书与已发布的 Google 根证书匹配
- 确认链中没有证书被撤销(检查 CRL @https://android.googleapis.com/attestation/status)
- examine the properties of the Google Key Attestation extension (OID 1.3.6.1.4.1.11129.2.1.17) of the leaf cert
- 确认随机数匹配(
attestationChallenge
)
- 咨询
attestationSecurityLevel
of KeyDescription
SecurityLevel ::= ENUMERATED {
Software (0),
TrustedEnvironment (1),
StrongBox (2),
}
TrustedEnvironment
and StrongBox
两者都对应于硬件支持的密钥和加密操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)