如何检查Android手机是否支持TEE?

时间:2020-04-15 09:48:58

标签: java android cryptography keystore android-keystore

我已经阅读了这两篇文章:OneTwo,但是我仍然有疑问。

我使用KeyStore(Android 9)生成AES密钥,并使用isInsideSecureHardware()方法检查密钥 isInsideSecureHardware 。我得到了返回 False 。可以找到示例代码herehere

布尔布尔值isInsideSecureHardware()

如果密钥位于安全硬件(例如,受信任的执行环境(TEE)或安全元素(SE))内部,则返回true。此类密钥的密钥材料仅在安全硬件内部以明文形式提供,而不会在外部暴露。

因此,我想进一步确认我的电话设备(华为P20)是否支持TEE。

问题:

  1. 如果电话支持TEE,那么KeyStore生成的密钥会自动存储到TEE中吗?我需要在Java中进行任何手动配置吗?我听说只要您使用 KeyStore.getInstance() KeyGenerator,密钥将自动存储在TEE中 .getInstance(算法,密钥库名称) 。但是我不确定这是对还是错?

  2. 如果问题1的答案是“需要手动配置”,则成为 isInsideSecureHardware ()返回 False 的原因了吧?如果Q1的答案是“自动”,请忽略Q2。

  3. 有什么方法可以直接检查电话是否支持Java中的TEE?

2 个答案:

答案 0 :(得分:2)

来自Android keystore system文档:

安装了运行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>
  • 从Android密钥库中请求密钥的证明链
  • 将证明数据(证书链)传递到您的服务器
  • 验证服务器上的证明(签名)链
  • 确认根证书与已发布的Google根证书匹配
  • 确认没有证书链中的证书被撤销(对CRL @ https://android.googleapis.com/attestation/status进行检查)
  • 检查叶子证书的Google密钥证明扩展(OID 1.3.6.1.4.1.11129.2.1.17)的属性
    • 确认随机数匹配(attestationChallenge
    • 咨询attestationSecurityLevel中的KeyDescription
SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

TrustedEnvironmentStrongBox都对应于硬件支持的密钥和加密操作。