[英]How to check whether Android phone supports TEE?
我使用 KeyStore (Android 9) 生成 AES 密鑰,並使用isInsideSecureHardware()方法檢查密鑰是否為isInsideSecureHardware 。 我得到了回報False 。 可以在此處和此處找到示例代碼。
公共 boolean isInsideSecureHardware ()
如果密鑰位於安全硬件(例如,可信執行環境 (TEE) 或安全元件 (SE))內,則返回 true。 此類密鑰的密鑰材料僅在安全硬件內部以明文形式提供,並且不會暴露在其外部。
因此,我想進一步確認我的手機設備(華為 P20)是否支持 TEE。
問題:
如果手機支持 TEE,KeyStore 生成的密鑰會自動存入 TEE 嗎? 我需要在 Java 中進行任何手動配置嗎? 聽說只要你使用KeyStore.getInstance() , KeyGenerator.getInstance(algorithm, KeyStore Name) ,密鑰會自動存儲在 TEE 中。 但我不確定這是真的還是假的?
如果 Q1 的答案是“需要手動配置”,那就是isInsideSecureHardware () 返回False的原因吧? 如果 Q1 的答案是“自動”,則忽略 Q2。
在Java中有什么方法可以直接查看手機是否支持TEE?
來自Android 密鑰庫系統文檔:
運行 Android 9(API 級別 28)或更高版本的受支持設備可以安裝 StrongBox Keymaster,這是一種位於硬件安全模塊中的 Keymaster HAL 實現。 該模塊包含以下內容:
[...]
*安全存儲。
[...]
檢查存儲在 StrongBox Keymaster 中的密鑰時,系統會通過可信執行環境 (TEE) 驗證密鑰的完整性。
[...]
使用 KeyStore class 生成或導入密鑰時,您可以通過將 true 傳遞給 setIsStrongBoxBacked() 方法來指示將密鑰存儲在 StrongBox Keymaster 中的偏好。
據我了解,這意味着當您生成 Key 並為密鑰配置調用keyGenParameterSpecBuilder.setIsStrongBoxBacked(true)
時,您可以確保它由TEE
支持。 如果沒有可用的TEE
,它將拋出StrongBoxUnavailableException
。
因此,要檢查是否有可用的TEE
,您可以嘗試以這種方式生成密鑰並查看它是否有效。
@JensV 是正確的:如果您在setIsStrongBoxBacked
上設置keyGenParameterSpecBuilder
,如果 StrongBox 不受支持,則密鑰生成將失敗並出現StrongBoxUnavailableException
。 然而,中間情況——存在 TEE(即在安全硬件中生成和使用密鑰),但不支持 StrongBox——更難以辨別。
一般來說,go 的方法是在設備上實際生成一個密鑰,然后在服務器上對其進行硬件密鑰證明- 查閱簽名的密鑰屬性以檢查硬件支持的確切程度:
setAttestationChallenge
構建器上的KeyGenParameterSpec
並傳入您從服務器獲得的隨機數來請求硬件證明(不要使用在設備上生成的隨機數)attestationChallenge
)KeyDescription
的attestationSecurityLevel
SecurityLevel ::= ENUMERATED {
Software (0),
TrustedEnvironment (1),
StrongBox (2),
}
TrustedEnvironment
和StrongBox
都對應於硬件支持的密鑰和加密操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.