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

标签 java android cryptography keystore android-keystore

我读过这两篇文章:OneTwo ,但我还有疑问。

我使用 KeyStore (Android 9) 生成 AES key ,并使用 isInsideSecureHardware()方法检查 key 是否isInsideSecureHardware。我得到返回 False。示例代码可见here ,和 here .

public boolean isInsideSecureHardware ()

Returns true if the key resides inside secure hardware (e.g., Trusted Execution Environment (TEE) or Secure Element (SE)). Key material of such keys is available in plaintext only inside the secure hardware and is not exposed outside of it.

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

问题:

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

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

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

最佳答案

@JensV 是正确的:如果您在 keyGenParameterSpecBuilder 上设置 setIsStrongBoxBacked,并且不支持 StrongBox,则 key 生成将失败并出现 StrongBoxUnavailableException。然而,中间情况 - 存在 TEE(即在安全硬件内生成和使用 key ),但不支持 StrongBox - 更难以辨别。

一般来说,可行的方法是在设备上实际生成 key ,然后执行 HW key attestation on it at the server - 查阅已签署的关键属性以检查硬件支持的确切程度:

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

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

关于java - 如何检查Android手机是否支持TEE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61225795/

相关文章:

java - 在 IntelliJ IDEA 中更改 Git 用户

android - 在我的 Android 应用程序上添加保管箱功能?

cryptography - 用什么?电子签名?

javascript - 将纯 Nativescript 5.x 项目迁移到 Nativescript 6 - JS ERROR NOT READY : generator isn't seeded

java - 如何在 java 中转义正斜杠以便在路径中使用它

java - Play 框架从 2.1 更新到 2.2 : SimpleResult not working - compile error

android - 有人用过 ACR1222L android 库吗?

cryptography - 将 Assets 链接到 solana token

java - ConceptNet 5.5 和 JSON 格式

java - E/BitmapFactory : Unable to decode stream: java. io.FileNotFoundException(没有这样的文件或目录)