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

TJC*_*ARK 8 java android cryptography keystore android-keystore

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

我使用 KeyStore (Android 9) 生成 AES 密钥,并使用isInsideSecureHardware()方法检查密钥是否isInsideSecureHardware。我得到了 return False示例代码可以在此处此处找到。

公共布尔 isInsideSecureHardware ()

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

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

问题:

  1. 如果手机支持TEE,KeyStore生成的密钥会自动存储到TEE中吗?我需要在 Java 中进行任何手动配置吗?我听说只要使用KeyStore.getInstance()KeyGenerator .getInstance(algorithm, KeyStore Name) ,密钥就会自动存储在 TEE 中。但我不确定这是真的还是假的?

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

  3. 有什么方法可以在Java中直接检查手机是否支持TEE?

dav*_*zen 6

@JensV 是正确的:如果您设置setIsStrongBoxBackedkeyGenParameterSpecBuilder,则密钥生成将失败,并显示“StrongBoxUnavailableException如果 StrongBox 不受支持”。然而,中间情况 - 存在 TEE(即在安全硬件内生成和使用密钥),但不支持 StrongBox - 更难以辨别。

一般来说,正确的方法是在设备上实际生成密钥,然后在服务器上对其执行硬件密钥证明- 查阅签名的密钥属性以检查硬件支持的确切程度:

  • 在服务器上生成一个随机数(随机字节字符串),将其传递给设备
  • 在设备上生成密钥,通过调用构建器并传入从服务器获得的随机数来请求硬件证明setAttestationChallengeKeyGenParameterSpec请勿使用设备上生成的随机数)
  • 从 Android 密钥存储请求密钥的证明链
  • 将证明数据(证书链)传递到您的服务器
  • 验证服务器上的证明(签名)链
  • 确认根证书与已发布的 Google 根证书匹配
  • 确认链中没有证书被撤销(检查 CRL @ https://android.googleapis.com/attestation/status
  • 检查叶证书的 Google 密钥证明扩展 (OID 1.3.6.1.4.1.11129.2.1.17) 的属性
    • 确认随机数匹配 ( attestationChallenge)
    • 咨询attestationSecurityLevelKeyDescription
SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}
Run Code Online (Sandbox Code Playgroud)

TrustedEnvironment两者StrongBox都对应于硬件支持的密钥和加密操作。


Jen*_*nsV 3

来自Android 密钥库系统文档:

运行 Android 9(API 级别 28)或更高版本的受支持设备可以安装 StrongBox Keymaster,它是驻留在硬件安全模块中的 Keymaster HAL 的实现。该模块包含以下内容:
[...]
* 安全存储。
[...]
当检查 StrongBox Keymaster 中存储的密钥时,系统会通过可信执行环境 (TEE) 确认密钥的完整性。
[...]
使用 KeyStore 类生成或导入密钥时,您可以通过将 true 传递给 setIsStrongBoxBacked() 方法来指示将密钥存储在 StrongBox Keymaster 中的首选项。

根据我的理解,这意味着当您生成密钥并调用keyGenParameterSpecBuilder.setIsStrongBoxBacked(true)密钥配置时,您可以确保它由TEE. 如果没有TEE可用的,它会抛出一个StrongBoxUnavailableException.

因此,要检查是否有TEE可用的,您可以尝试以这种方式生成密钥并查看它是否有效。