TJC*_*ARK 8 java android cryptography keystore android-keystore
我使用 KeyStore (Android 9) 生成 AES 密钥,并使用isInsideSecureHardware()方法检查密钥是否isInsideSecureHardware。我得到了 return False。示例代码可以在此处和此处找到。
公共布尔 isInsideSecureHardware ()
如果密钥驻留在安全硬件(例如,可信执行环境 (TEE) 或安全元件 (SE))内,则返回 true。此类密钥的密钥材料仅在安全硬件内部以明文形式提供,并且不会暴露在安全硬件外部。
因此,我想进一步确认我的手机设备(华为P20)是否支持TEE。
问题:
如果手机支持TEE,KeyStore生成的密钥会自动存储到TEE中吗?我需要在 Java 中进行任何手动配置吗?我听说只要使用KeyStore.getInstance()、KeyGenerator .getInstance(algorithm, KeyStore Name) ,密钥就会自动存储在 TEE 中。但我不确定这是真的还是假的?
如果问题1的答案是“需要手动配置”,那就成为isInsideSecureHardware () 返回False的原因,对吧?如果 Q1 的答案是“自动”,则忽略 Q2。
有什么方法可以在Java中直接检查手机是否支持TEE?
@JensV 是正确的:如果您设置setIsStrongBoxBacked了keyGenParameterSpecBuilder,则密钥生成将失败,并显示“StrongBoxUnavailableException如果 StrongBox 不受支持”。然而,中间情况 - 存在 TEE(即在安全硬件内生成和使用密钥),但不支持 StrongBox - 更难以辨别。
一般来说,正确的方法是在设备上实际生成密钥,然后在服务器上对其执行硬件密钥证明- 查阅签名的密钥属性以检查硬件支持的确切程度:
setAttestationChallenge(KeyGenParameterSpec请勿使用设备上生成的随机数)attestationChallenge)attestationSecurityLevel的KeyDescriptionSecurityLevel ::= ENUMERATED {
Software (0),
TrustedEnvironment (1),
StrongBox (2),
}
Run Code Online (Sandbox Code Playgroud)
TrustedEnvironment两者StrongBox都对应于硬件支持的密钥和加密操作。
来自Android 密钥库系统文档:
运行 Android 9(API 级别 28)或更高版本的受支持设备可以安装 StrongBox Keymaster,它是驻留在硬件安全模块中的 Keymaster HAL 的实现。该模块包含以下内容:
[...]
* 安全存储。
[...]
当检查 StrongBox Keymaster 中存储的密钥时,系统会通过可信执行环境 (TEE) 确认密钥的完整性。
[...]
使用 KeyStore 类生成或导入密钥时,您可以通过将 true 传递给 setIsStrongBoxBacked() 方法来指示将密钥存储在 StrongBox Keymaster 中的首选项。
根据我的理解,这意味着当您生成密钥并调用keyGenParameterSpecBuilder.setIsStrongBoxBacked(true)密钥配置时,您可以确保它由TEE. 如果没有TEE可用的,它会抛出一个StrongBoxUnavailableException.
因此,要检查是否有TEE可用的,您可以尝试以这种方式生成密钥并查看它是否有效。
| 归档时间: |
|
| 查看次数: |
3838 次 |
| 最近记录: |