KeyStore 能讓您以更安全的方式建立、儲存及使用加密編譯金鑰。當可使用並使用硬體支援的金鑰儲存空間時,金鑰內容的安全性就會提高,不易從裝置中擷取,而 Keymaster 會強制執行難以破壞的限制。
不過,只有在已知金鑰庫金鑰位於硬體支援儲存空間時,這項做法才適用。在 Keymaster 1 中,應用程式或遠端伺服器無法可靠地驗證是否發生這種情況。金鑰存放區守護程序會載入可用的 Keymaster HAL,並相信 HAL 針對金鑰的硬體支援所說的任何內容。
為解決這個問題,Keymaster 在 Android 7.0 (Keymaster 2) 中推出金鑰認證功能,並在 Android 8.0 (Keymaster 3) 中推出 ID 認證功能。
金鑰認證旨在提供一種方法,可明確判斷非對稱金鑰組是否有硬體支援、金鑰的屬性為何,以及對其用途施加哪些限制。
ID 認證可讓裝置提供硬體 ID 的證明,例如序號或 IMEI。
金鑰認證
為支援金鑰認證,Android 7.0 為 HAL 引進一組標記、類型和方法。
標記
Tag::ATTESTATION_CHALLENGE
Tag::INCLUDE_UNIQUE_ID
Tag::RESET_SINCE_ID_ROTATION
類型
Keymaster 2 以下版本
typedef struct { keymaster_blob_t* entries; size_t entry_count; } keymaster_cert_chain_t;
AttestKey
方法
Keymaster 3
attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams) generates(ErrorCode error, vec<vec<uint8_t>> certChain);
Keymaster 2 以下版本
keymaster_error_t (*attest_key)(const struct keymaster2_device* dev, const keymaster_key_blob_t* key_to_attest, const keymaster_key_param_set_t* attest_params, keymaster_cert_chain_t* cert_chain);
dev
是 Keymaster 裝置結構。keyToAttest
是從generateKey
傳回的金鑰 Blob,系統會根據該 Blob 建立認證。attestParams
是認證所需的任何參數清單。包括Tag::ATTESTATION_CHALLENGE
和Tag::RESET_SINCE_ID_ROTATION
,以及Tag::APPLICATION_ID
和Tag::APPLICATION_DATA
。如果在金鑰產生期間指定了後兩者,則必須使用這兩者才能解密金鑰 blob。certChain
是輸出參數,會傳回憑證陣列。項目 0 是認證憑證,表示該憑證會認證keyToAttest
中的金鑰,並包含認證擴充資料。
attestKey
方法可視為已驗證金鑰的公開金鑰作業,因為這項方法可隨時呼叫,且不需要符合授權限制。舉例來說,如果認證金鑰需要使用者驗證,則可在沒有使用者驗證的情況下產生認證。
認證證書
認證憑證是標準的 X.509 憑證,具有選用的認證擴充資料,包含認證金鑰的說明。使用認證的認證金鑰簽署憑證。認證金鑰可能會使用與認證金鑰不同的演算法。
認證證明書包含下表中的欄位,且不得包含任何其他欄位。部分欄位會指定固定欄位值。CTS 測試會驗證憑證內容是否與定義完全一致。
憑證序列
欄位名稱 (請參閱 RFC 5280) | 值 |
---|---|
tbsCertificate | TBSCertificate 序列 |
signatureAlgorithm | 用來簽署金鑰的演算法 ID: ECDSA 用於 EC 金鑰,RSA 用於 RSA 金鑰。 |
signatureValue | BIT STRING,以 ASN.1 DER 編碼 tbsCertificate 計算的簽章。 |
TBSCertificate 序列
欄位名稱 (請參閱 RFC 5280) | 值 |
---|---|
version |
INTEGER 2 (代表 v3 憑證) |
serialNumber |
INTEGER 1 (固定值:所有憑證的值相同) |
signature |
簽署金鑰的演算法演算法 ID,包括 EC 金鑰的 ECDSA、RSA 金鑰的 RSA。 |
issuer |
與批次認證金鑰的主旨欄位相同。 |
validity |
包含兩個日期的序列,其中包含 Tag::ACTIVE_DATETIME 和 Tag::USAGE_EXPIRE_DATETIME 的值。這些值以自 1970 年 1 月 1 日起的毫秒為單位。如要瞭解憑證中日期的正確表示方式,請參閱 RFC 5280。 如果沒有 Tag::ACTIVE_DATETIME ,請使用 Tag::CREATION_DATETIME 的值。如果沒有 Tag::USAGE_EXPIRE_DATETIME ,請使用批次認證金鑰憑證的到期日。 |
subject |
CN =「Android KeyStore Key」(固定值:所有憑證皆相同) |
subjectPublicKeyInfo |
包含已認證公開金鑰的 SubjectPublicKeyInfo。 |
extensions/Key Usage |
digitalSignature:如果金鑰具有用途 KeyPurpose::SIGN 或 KeyPurpose::VERIFY ,則設為此值。所有其他位元都未設定。 |
extensions/CRL Distribution Points |
值 TBD |
extensions/"attestation" |
OID 為 1.3.6.1.4.1.11129.2.1.17;內容定義請參閱下方的「認證擴充功能」一節。如同所有 X.509 憑證擴充功能,內容會以 OCTET_STRING 表示,其中包含認證序列的 DER 編碼。 |
認證擴充功能
attestation
擴充功能包含 OID 1.3.6.1.4.1.11129.2.1.17
。其中包含金鑰組的認證資訊,以及金鑰產生時的裝置狀態。
AIDL 介面規格中定義的 Keymaster/KeyMint 標記類型會轉譯為下列 ASN.1 類型:
Keymaster/KeyMint 類型 | ASN.1 類型 | 附註 |
---|---|---|
ENUM |
INTEGER |
|
ENUM_REP |
SET of INTEGER |
|
UINT |
INTEGER |
|
UINT_REP |
SET of INTEGER |
|
ULONG |
INTEGER |
|
ULONG_REP |
SET of INTEGER |
|
DATE |
INTEGER |
自格林威治標準時間 1970 年 1 月 1 日 00:00:00 起的毫秒數。 |
BOOL |
NULL |
標記存在表示為 true,不存在則為 false。 |
BIGNUM |
沒有任何代碼具有此類型,因此不會定義對應項目。 | |
BYTES |
OCTET_STRING |
結構定義
認證擴充內容的說明如下 ASN.1 結構定義:
300 版
KeyDescription ::= SEQUENCE { attestationVersion 300, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, attestationIdSecondImei [723] EXPLICIT OCTET_STRING OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
版本 200
KeyDescription ::= SEQUENCE { attestationVersion 200, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
版本 100
KeyDescription ::= SEQUENCE { attestationVersion 100, attestationSecurityLevel SecurityLevel, keyMintVersion INTEGER, keyMintSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, mgfDigest [203] EXPLICIT SET OF INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, usageCountLimit [405] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
版本 4
KeyDescription ::= SEQUENCE { attestationVersion 4, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, earlyBootOnly [305] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, deviceUniqueAttestation [720] EXPLICIT NULL OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
版本 3
KeyDescription ::= SEQUENCE { attestationVersion 3, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), StrongBox (2), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, rollbackResistance [303] EXPLICIT NULL OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, trustedUserPresenceRequired [507] EXPLICIT NULL OPTIONAL, trustedConfirmationRequired [508] EXPLICIT NULL OPTIONAL, unlockedDeviceRequired [509] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, vendorPatchLevel [718] EXPLICIT INTEGER OPTIONAL, bootPatchLevel [719] EXPLICIT INTEGER OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, verifiedBootHash OCTET_STRING, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
版本 2
KeyDescription ::= SEQUENCE { attestationVersion 2, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rollbackResistant [703] EXPLICIT NULL OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, attestationApplicationId [709] EXPLICIT OCTET_STRING OPTIONAL, attestationIdBrand [710] EXPLICIT OCTET_STRING OPTIONAL, attestationIdDevice [711] EXPLICIT OCTET_STRING OPTIONAL, attestationIdProduct [712] EXPLICIT OCTET_STRING OPTIONAL, attestationIdSerial [713] EXPLICIT OCTET_STRING OPTIONAL, attestationIdImei [714] EXPLICIT OCTET_STRING OPTIONAL, attestationIdMeid [715] EXPLICIT OCTET_STRING OPTIONAL, attestationIdManufacturer [716] EXPLICIT OCTET_STRING OPTIONAL, attestationIdModel [717] EXPLICIT OCTET_STRING OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
版本 1
KeyDescription ::= SEQUENCE { attestationVersion 1, attestationSecurityLevel SecurityLevel, keymasterVersion INTEGER, keymasterSecurityLevel SecurityLevel, attestationChallenge OCTET_STRING, uniqueId OCTET_STRING, softwareEnforced AuthorizationList, hardwareEnforced AuthorizationList, } SecurityLevel ::= ENUMERATED { Software (0), TrustedEnvironment (1), } AuthorizationList ::= SEQUENCE { purpose [1] EXPLICIT SET OF INTEGER OPTIONAL, algorithm [2] EXPLICIT INTEGER OPTIONAL, keySize [3] EXPLICIT INTEGER OPTIONAL, digest [5] EXPLICIT SET OF INTEGER OPTIONAL, padding [6] EXPLICIT SET OF INTEGER OPTIONAL, ecCurve [10] EXPLICIT INTEGER OPTIONAL, rsaPublicExponent [200] EXPLICIT INTEGER OPTIONAL, activeDateTime [400] EXPLICIT INTEGER OPTIONAL, originationExpireDateTime [401] EXPLICIT INTEGER OPTIONAL, usageExpireDateTime [402] EXPLICIT INTEGER OPTIONAL, noAuthRequired [503] EXPLICIT NULL OPTIONAL, userAuthType [504] EXPLICIT INTEGER OPTIONAL, authTimeout [505] EXPLICIT INTEGER OPTIONAL, allowWhileOnBody [506] EXPLICIT NULL OPTIONAL, allApplications [600] EXPLICIT NULL OPTIONAL, creationDateTime [701] EXPLICIT INTEGER OPTIONAL, origin [702] EXPLICIT INTEGER OPTIONAL, rollbackResistant [703] EXPLICIT NULL OPTIONAL, rootOfTrust [704] EXPLICIT RootOfTrust OPTIONAL, osVersion [705] EXPLICIT INTEGER OPTIONAL, osPatchLevel [706] EXPLICIT INTEGER OPTIONAL, } RootOfTrust ::= SEQUENCE { verifiedBootKey OCTET_STRING, deviceLocked BOOLEAN, verifiedBootState VerifiedBootState, } VerifiedBootState ::= ENUMERATED { Verified (0), SelfSigned (1), Unverified (2), Failed (3), }
KeyDescription 欄位
-
attestationVersion
-
ASN.1 結構定義版本。
值 Keymaster/KeyMint 版本 1 Keymaster 2.0 版 2 Keymaster 3.0 版 3 Keymaster 4.0 版 4 Keymaster 4.1 版 100 KeyMint 1.0 版 200 KeyMint 2.0 版 300 KeyMint 3.0 版 -
attestationSecurityLevel
-
儲存已認證金鑰的位置的安全性等級。
-
keymasterVersion
/keyMintVersion
-
Keymaster/KeyMint 硬體抽象層 (HAL) 實作的版本。
值 Keymaster/KeyMint 版本 2 Keymaster 2.0 版 3 Keymaster 3.0 版 4 Keymaster 4.0 版 41 Keymaster 4.1 版 100 KeyMint 1.0 版 200 KeyMint 2.0 版 300 KeyMint 3.0 版 -
keymasterSecurityLevel
/keyMintSecurityLevel
- Keymaster/KeyMint 實作的安全性等級。
-
attestationChallenge
- 在產生金鑰時提供的驗證問題。
-
uniqueId
- 系統應用程式可在金鑰產生時要求的隱私權敏感裝置 ID。如未要求專屬 ID,這個欄位會留空。 詳情請參閱「專屬 ID」一節。
-
softwareEnforced
-
由 Android 系統強制執行的 Keymaster/KeyMint 授權清單。這項資訊是由平台中的程式碼收集或產生,並儲存在裝置的系統分區中。只要裝置執行的作業系統符合 Android 平台安全性模型 (也就是裝置的系統啟動載入程式處於鎖定狀態,且
verifiedBootState
為Verified
),即可信任該裝置。 -
hardwareEnforced
- 由裝置的受信任執行環境 (TEE) 或 StrongBox 強制執行的 Keymaster/KeyMint 授權清單。這類資訊是由安全硬體中的程式碼收集或產生,並非由平台控制。舉例來說,資訊可以來自系統啟動載入程式,或是透過不涉及信任平台的安全通訊管道。
SecurityLevel 值
SecurityLevel
值代表 KeyStore 相關元素 (例如金鑰組和認證) 能彈性應對的程度。
值 | 意義 |
---|---|
Software |
只要裝置的 Android 系統符合 Android 平台安全性模型 (也就是裝置的系統啟動載入程式處於鎖定狀態,且 verifiedBootState 為 Verified ),就算安全。 |
TrustedEnvironment |
只要受信任的執行環境 (TEE) 未遭入侵,便安全無虞。TEE 的隔離需求定義在 Android 相容性定義說明文件的 第 9.11 節 [C-1-1] 至 [C-1-4] 中。TEE 能強力抵禦遠端入侵,還能夠抵禦直接硬體攻擊,可有效抵擋入侵行為。 |
StrongBox |
只要 StrongBox 未遭到入侵,就安全無虞。StrongBox 是在類似硬體安全性模組的安全元件中實作。如要瞭解 StrongBox 的實作要求,請參閱 Android 相容性定義說明文件的第 9.11.2 節。StrongBox 可有效抵禦遠端入侵和直接硬體攻擊 (例如實體竄改和旁路攻擊)。 |
AuthorizationList 欄位
每個欄位都會對應至 AIDL 介面規格中的 Keymaster/KeyMint 授權標記。規格是授權標記的真實來源:標記的含義、內容格式、是否應顯示在 KeyDescription
物件的 softwareEnforced
或 hardwareEnforced
欄位中、是否與其他標記互斥等等。所有 AuthorizationList
欄位皆為選用欄位。
每個欄位都有一個 EXPLICIT
特定情境標記,等同於 Keymaster/KeyMint 標記編號,可在 AuthorizationList
中以更精簡的方式呈現資料。因此,ASN.1 剖析器必須知道每個特定情境標記的預期資料類型。例如,Tag::USER_AUTH_TYPE
定義為 ENUM | 504
。在認證擴充功能結構定義中,AuthorizationList
中的 purpose
欄位會指定為 userAuthType [504] EXPLICIT INTEGER OPTIONAL
。因此,其 ASN.1 編碼會包含特定情境的標記 504
,而非 ASN.1 類型 INTEGER
(即 10
) 的 UNIVERSAL
類別標記。
-
purpose
-
對應至使用標記 ID 值 1 的
Tag::PURPOSE
授權標記。 -
algorithm
-
對應至使用標記 ID 值 2 的
Tag::ALGORITHM
授權標記。在認證
AuthorizationList
物件中,演算法的值一律為RSA
或EC
。 -
keySize
-
對應至使用標記 ID 值 3 的
Tag::KEY_SIZE
授權標記。 -
digest
-
對應至使用標記 ID 值 5 的
Tag::DIGEST
授權標記。 -
padding
-
對應至使用標記 ID 值 6 的
Tag::PADDING
授權標記。 -
ecCurve
-
對應至使用標記 ID 值 10 的
Tag::EC_CURVE
授權標記。這組參數是用來在 Android 系統 KeyStore 中產生橢圓曲線 (EC) 金鑰組 (使用 ECDSA 進行簽署和驗證)。
-
rsaPublicExponent
-
對應至使用標記 ID 值 200 的
Tag::RSA_PUBLIC_EXPONENT
授權標記。 -
mgfDigest
-
只存在於金鑰認證 100 以上版本中。
對應至使用標記 ID 值 203 的Tag::RSA_OAEP_MGF_DIGEST
KeyMint 授權標記。 -
rollbackResistance
-
只存在於金鑰認證 3 以上版本中。
對應至使用標記 ID 值 303 的
Tag::ROLLBACK_RESISTANCE
授權標記。 -
earlyBootOnly
-
只存在於金鑰認證 4 以上版本中。
對應至使用標記 ID 值 305 的
Tag::EARLY_BOOT_ONLY
授權標記。 -
activeDateTime
-
對應至使用標記 ID 值 400 的
Tag::ACTIVE_DATETIME
授權標記。 -
originationExpireDateTime
-
對應至使用標記 ID 值 401 的
Tag::ORIGINATION_EXPIRE_DATETIME
Keymaster 授權標記。 -
usageExpireDateTime
-
對應至使用標記 ID 值 402 的
Tag::USAGE_EXPIRE_DATETIME
授權標記。 -
usageCountLimit
-
對應至使用標記 ID 值 405 的
Tag::USAGE_COUNT_LIMIT
授權標記。 -
noAuthRequired
-
對應至使用標記 ID 值 503 的
Tag::NO_AUTH_REQUIRED
授權標記。 -
userAuthType
-
對應至使用標記 ID 值 504 的
Tag::USER_AUTH_TYPE
授權標記。 -
authTimeout
-
對應至使用標記 ID 值 505 的
Tag::AUTH_TIMEOUT
授權標記。 -
allowWhileOnBody
-
對應至使用標記 ID 值 506 的
Tag::ALLOW_WHILE_ON_BODY
授權標記。如果使用者仍將裝置戴在身體上,則允許金鑰在驗證逾時後繼續使用。請注意,安全的人體感應器可判斷裝置是否戴在使用者的身體上。
-
trustedUserPresenceRequired
-
只存在於金鑰認證 3 以上版本中。
對應至使用標記 ID 值 507 的
Tag::TRUSTED_USER_PRESENCE_REQUIRED
授權標記。指定只有在使用者已提供實際存在證明的情況下,這個金鑰才能使用。以下提供幾個範例:
- 如果是 StrongBox 金鑰,硬體按鈕會以有線方式連接至 StrongBox 裝置上的 PIN 碼。
- 如果是 TEE 金鑰,只要 TEE 擁有掃描器的專屬控制權,並執行指紋比對程序,指紋驗證功能就會提供存在證明。
-
trustedConfirmationRequired
-
只存在於金鑰認證 3 以上版本中。
對應至使用標記 ID 值 508 的
Tag::TRUSTED_CONFIRMATION_REQUIRED
授權標記。指定只有在使用者確認要透過已核准權杖簽署資料時,金鑰才能使用。如要進一步瞭解如何取得使用者確認,請參閱「Android 保護確認」。
注意:這個標記僅適用於
SIGN
用途的金鑰。 -
unlockedDeviceRequired
-
只存在於金鑰認證 3 以上版本中。
對應至使用標記 ID 值 509 的
Tag::UNLOCKED_DEVICE_REQUIRED
授權標記。 -
allApplications
-
對應至使用標記 ID 值 600 的
Tag::ALL_APPLICATIONS
授權標記。指出裝置上的所有應用程式是否都能存取金鑰組。
-
applicationId
-
對應至使用標記 ID 值 601 的
Tag::APPLICATION_ID
授權標記。 -
creationDateTime
-
對應至使用標記 ID 值 701 的
Tag::CREATION_DATETIME
授權標記。 -
origin
-
對應至使用標記 ID 值 702 的
Tag::ORIGIN
授權標記。 -
rollbackResistant
-
只存在於金鑰認證版本 1 和 2 中。
對應至使用標記 ID 值 703 的
Tag::ROLLBACK_RESISTANT
授權標記。 -
rootOfTrust
-
對應至使用標記 ID 值 704 的
Tag::ROOT_OF_TRUST
授權標記。詳情請參閱說明 RootOfTrust 資料結構的章節。
-
osVersion
-
對應至使用標記 ID 值 705 的
Tag::OS_VERSION
授權標記。與 Keymaster 相關聯的 Android 作業系統版本,以六位數整數指定。舉例來說,8.1.0 版會以 080100 表示。
只有 Keymaster 1.0 以上版本的金鑰會在授權清單中包含這個值。
-
osPatchLevel
-
對應至使用標記 ID 值 706 的
Tag::PATCHLEVEL
授權標記。與在 Keymaster 中使用的安全修補程式相關聯的月份和年份,以六位數整數表示。舉例來說,2018 年 8 月的修補程式會以 201808 表示。
只有 Keymaster 1.0 以上版本的金鑰會在授權清單中包含這個值。
-
attestationApplicationId
-
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 709 的
Tag::ATTESTATION_APPLICATION_ID
Keymaster 授權標記。詳情請參閱說明 AttestationApplicationId 資料結構的章節。
-
attestationIdBrand
-
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 710 的
Tag::ATTESTATION_ID_BRAND
Keymaster 授權標記。 -
attestationIdDevice
-
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 711 的
Tag::ATTESTATION_ID_DEVICE
Keymaster 授權標記。 -
attestationIdProduct
-
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 712 的
Tag::ATTESTATION_ID_PRODUCT
Keymaster 授權標記。 -
attestationIdSerial
-
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 713 的
Tag::ATTESTATION_ID_SERIAL
Keymaster 授權標記。 -
attestationIdImei
-
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 714 的
Tag::ATTESTATION_ID_IMEI
授權標記。 -
attestationIdMeid
-
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 715 的
Tag::ATTESTATION_ID_MEID
授權標記。 -
attestationIdManufacturer
-
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 716 的
Tag::ATTESTATION_ID_MANUFACTURER
授權標記。 -
attestationIdModel
-
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 717 的
Tag::ATTESTATION_ID_MODEL
授權標記。 -
vendorPatchLevel
-
只存在於金鑰認證 3 以上版本中。
對應至使用標記 ID 值 718 的
Tag::VENDOR_PATCHLEVEL
授權標記。指定如要使用此金鑰,必須在裝置上安裝的「供應商映像檔」安全性修補程式等級。這個值會以 YYYYMMDD 的格式顯示,代表供應商提供安全性修補程式的日期。舉例來說,如果產生金鑰的 Android 裝置安裝了供應商在 2018 年 8 月 1 日提供的安全性修補程式,這個值會是 20180801。
-
bootPatchLevel
-
只存在於金鑰認證 3 以上版本中。
對應至使用標記 ID 值 719 的
Tag::BOOT_PATCHLEVEL
授權標記。指定如要使用此金鑰,必須在裝置上安裝的「核心映像檔」安全性修補程式等級。這個值會以 YYYYMMDD 的格式顯示,代表系統提供安全性修補程式的日期。舉例來說,如果產生金鑰的 Android 裝置安裝了系統在 2018 年 8 月 5 日提供的安全性修補程式,這個值會是 20180805。
-
deviceUniqueAttestation
-
只存在於金鑰認證 4 以上版本中。
對應於使用標記 ID 值 720 的
Tag::DEVICE_UNIQUE_ATTESTATION
授權標記。 -
attestationIdSecondImei
-
只存在於金鑰認證 300 以上版本中。
對應至使用標記 ID 值 723 的
Tag::ATTESTATION_ID_SECOND_IMEI
授權標記。
RootOfTrust 欄位
-
verifiedBootKey
- 公開金鑰的安全雜湊值,用於驗證裝置啟動期間執行的所有程式碼的完整性和真實性,做為已驗證的啟動的一部分。建議使用 SHA-256。
-
deviceLocked
-
裝置的系統啟動載入程式是否已鎖定。
true
表示裝置已啟動已簽署的映像檔,且已由驗證開機程序成功驗證。 -
verifiedBootState
- 裝置的驗證開機程序狀態。
-
verifiedBootHash
- 由驗證開機程序保護的所有資料摘要。如果裝置使用 Android 驗證開機程序參考實作項目,這個欄位會包含 VBMeta 摘要。
VerifiedBootState 值
值 | 對應的啟動狀態 | 意義 |
---|---|---|
Verified |
GREEN |
完整的信任鏈結會從硬體保護的信任根延伸至系統啟動載入程式,以及由驗證開機程序驗證的所有分區。在這個狀態下,verifiedBootKey 欄位包含內嵌信任根的雜湊,這是裝置製造商在出廠時,內嵌在裝置 ROM 中的憑證。 |
SelfSigned |
YELLOW |
與 Verified 相同,但驗證程序是使用使用者設定的信任根,而非製造商在工廠中嵌入的信任根。在這個狀態下,verifiedBootKey 欄位會包含使用者設定的公開金鑰雜湊。 |
Unverified |
ORANGE |
裝置的系統啟動載入程式已解鎖,因此無法建立信任鏈結。裝置可自由修改,因此使用者必須在額外管道驗證裝置的完整性。在這個狀態下,verifiedBootKey 欄位包含 32 個位元組的零。 |
Failed |
RED |
裝置驗證失敗。在這個狀態下,系統無法保證其他 RootOfTrust 欄位的內容。 |
AttestationApplicationId
這個欄位反映 Android 平台允許哪些應用程式使用認證中的密鑰資料。而且只有在多個套件共用同一個 UID 時,才能包含多個套件。AuthorizationList
中的 AttestationApplicationId
欄位為 OCTET_STRING
類型,並按照下列 ASN.1 結構定義設定格式:
AttestationApplicationId ::= SEQUENCE { package_infos SET OF AttestationPackageInfo, signature_digests SET OF OCTET_STRING, } AttestationPackageInfo ::= SEQUENCE { package_name OCTET_STRING, version INTEGER, }
package_infos
-
一組
AttestationPackageInfo
物件,每個物件都會提供套件名稱和版本號碼。 signature_digests
-
應用程式簽署憑證的 SHA-256 摘要。一個應用程式可以有多個簽署金鑰憑證鏈結。系統會擷取每個「分葉」憑證,並放在
signature_digests
欄位中。欄位名稱會誤導使用者,因為摘要資料是應用程式的簽署憑證,而非應用程式簽章,原因在於其命名依據為呼叫getPackageInfo()
傳回的Signature
類別。以下程式碼片段為摘要集的示例:{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
專屬 ID
專屬 ID 是 128 位元值,可用於識別裝置,但僅限於限定期間。計算值的方式如下:
HMAC_SHA256(T || C || R, HBK)
其中:
T
是「時間計數器值」,計算方式是將Tag::CREATION_DATETIME
的值除以 2592000000,並捨去任何餘數。T
每 30 天變更一次 (2592000000 = 30 * 24 * 60 * 60 * 1000)。C
是Tag::APPLICATION_ID
的值- 如果 attest_key 呼叫的 attest_params 參數中包含
Tag::RESET_SINCE_ID_ROTATION
,R
就會設為 1;如果沒有這個標記,就會設為 0。 HBK
是受信任的執行環境已知的專屬硬體繫結密鑰,這個密鑰絕對不會顯示。該機密金鑰至少包含 128 位元隨機性,且為個別裝置專屬 (由於有 128 位元隨機性,因此可接受機率不重複的情況)。HBK 應透過 HMAC 或 AES_CMAC 從融合金鑰內容衍生。
將 HMAC_SHA256 輸出內容截斷為 128 位元。
認證金鑰和憑證
兩個金鑰 (一個 RSA 和一個 ECDSA) 和對應的憑證鏈結已安全地佈建至裝置。
Android 12 推出了遠端金鑰佈建功能,Android 13 則需要裝置實作這項功能。遠端金鑰佈建功能會為現場裝置提供每個應用程式的 ECDSA P256 認證憑證。這些憑證的有效期限比工廠佈建的憑證短。
多個 IMEI
Android 14 新增了對 Android 金鑰認證記錄中多個 IMEI 的支援。原始設備製造商 (OEM) 可以為第二個 IMEI 新增 KeyMint 標記,實作這項功能。裝置擁有多個行動電台的情況越來越普遍,而原始設備製造商 (OEM) 現可支援裝置的兩個 IMEI。
OEM 必須具備次要 IMEI(如果裝置上有此資訊),並將其配置給 KeyMint 實作項目,以便這些實作項目能以與驗證第一個 IMEI 相同的方式驗證次要 IMEI。
ID 認證
Android 8.0 針對使用 Keymaster 3 的裝置提供 ID 認證的選用支援。裝置可透過 ID 認證提供硬體 ID (例如序號或 IMEI) 的證明。雖然這是選用功能,但強烈建議所有 Keymaster 3 實作都能支援這項功能,因為能夠證明裝置身分的功能可讓真實的零接觸遠端設定等用途更安全 (因為遠端端可以確定與正確的裝置通訊,而非裝置偽造身分)。
ID 認證的運作方式是建立只有受信任的執行環境 (TEE) 能在裝置退出原廠設定前能存取的裝置硬體 ID 副本。使用者可以解鎖裝置的引導程序,並變更系統軟體和 Android 架構回報的 ID。TEE 持有的 ID 副本無法以這種方式操控,可確保裝置 ID 認證只會認證裝置的原始硬體 ID,進而防範假冒攻擊。
身分認證的主要 API 途徑會在 Keymaster 2 推出的現有金鑰認證機制上建構。當呼叫端為金鑰管理員所持有的金鑰要求認證憑證時,可以要求將裝置的硬體 ID 納入認證憑證的中繼資料。如果金鑰儲存在 TEE 中,憑證鏈結會回溯至已知的信任根。這類憑證的收件者可以驗證憑證及其內容 (包括硬體 ID) 是由 TEE 所寫。當系統要求在認證證明書中加入硬體 ID 時,TEE 只會針對工廠填入的儲存裝置 ID 進行認證。
儲存空間屬性
儲存裝置 ID 的儲存空間必須具備下列屬性:
- 從裝置原始 ID 衍生的值會在裝置離開工廠前複製到儲存空間。
destroyAttestationIds()
方法可以永久刪除這個 ID 衍生資料副本。「永久刪除」代表資料會完全移除,因此恢復原廠設定或在裝置上執行的其他程序都無法還原。對於使用者已解鎖引導程序、變更系統軟體,以及修改 Android 架構所傳回的 ID 的裝置而言,這點尤其重要。- 退貨授權 (RMA) 設施應具備產生硬體 ID 衍生資料的新副本的功能。這樣一來,通過退貨授權的裝置就能再次執行身分認證。RMA 設施使用的機制必須受到保護,以免使用者自行叫用,因為這樣一來,使用者就能取得偽造 ID 的認證。
- 除了 TEE 中的 Keymaster 信任應用程式外,其他程式碼都無法讀取儲存空間中儲存的 ID 衍生資料。
- 儲存空間具有防竄改功能:如果儲存空間的內容遭到修改,TEE 會將其視為內容副本遭到破壞,並拒絕所有 ID 認證嘗試。這項功能的實作方式是簽署或使用 MAC 加密儲存空間,詳情請參閱下文。
- 儲存空間不會保留原始 ID。由於 ID 認證涉及挑戰,因此呼叫端一律會提供要認證的 ID。TEE 只需要驗證這些值是否與原始值相符。儲存原始值的安全雜湊值,而非值,即可啟用這項驗證。
營造業
如要建立具有上述屬性的實作項目,請在下列建構函式 S 中儲存 ID 衍生值。請勿儲存其他 ID 值副本,但可儲存在系統中可供裝置擁有者透過 Root 權限修改的一般位置:
S = D || HMAC(HBK, D)
其中:
D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
HMAC
是 HMAC 結構體,搭配適當的安全雜湊 (建議使用 SHA-256)HBK
是硬體綁定的鍵,不能用於其他用途ID1...IDn
是原始 ID 值;將特定值與特定索引建立關聯的方式取決於實作方式,因為不同裝置的 ID 數量不同||
代表連接
由於 HMAC 輸出內容的大小固定,因此不需要標頭或其他結構就能找到個別 ID 雜湊或 D 的 HMAC。除了檢查提供的值以執行認證外,實作也需要從 S 中擷取 D、計算 HMAC(HBK, D),並與 S 中的值進行比較,以驗證沒有個別 ID 遭到修改/損毀。此外,實作項目必須針對所有個別 ID 元素和 S 的驗證,使用常數時間比較。無論提供的 ID 數量為何,以及測試的任何部分是否正確比對,比較時間都必須保持不變。
硬體 ID
ID 認證支援下列硬體 ID:
- 品牌名稱,由 Android 中的
Build.BRAND
傳回 - Android 中的
Build.DEVICE
傳回的裝置名稱 - 產品名稱,由 Android 中的
Build.PRODUCT
傳回 - 製造商名稱,由
Build.MANUFACTURER
在 Android 中傳回 - Android 中
Build.MODEL
傳回的模型名稱 - 序號
- 所有無線電的 IMEI
- 所有無線電的 MEID
為支援裝置 ID 認證,裝置會對這些 ID 進行認證。所有搭載 Android 的裝置都具備前六項,且必須具備這些功能才能使用這項功能。如果裝置有任何整合式行動對講機,則必須支援對講機的 IMEI 和/或 MEID 認證。
系統會透過執行金鑰認證,並在要求中加入要認證的裝置 ID,來要求 ID 認證。這些 ID 會標記為:
ATTESTATION_ID_BRAND
ATTESTATION_ID_DEVICE
ATTESTATION_ID_PRODUCT
ATTESTATION_ID_MANUFACTURER
ATTESTATION_ID_MODEL
ATTESTATION_ID_SERIAL
ATTESTATION_ID_IMEI
ATTESTATION_ID_MEID
要認證的 ID 是 UTF-8 編碼的位元組字串。這個格式也適用於數字 ID。每個認證 ID 會以 UTF-8 編碼字串表示。
如果裝置不支援 ID 認證 (或先前已呼叫 destroyAttestationIds()
,且裝置無法再認證其 ID),則任何包含一或多個這些標記的金鑰認證要求都會失敗,並顯示 ErrorCode::CANNOT_ATTEST_IDS
。
如果裝置支援 ID 認證,且金鑰認證要求中包含上述一或多個標記,TEE 會驗證每個標記提供的 ID 是否與硬體 ID 的副本相符。如果有一或多個 ID 不符,整個認證程序就會失敗,並顯示 ErrorCode::CANNOT_ATTEST_IDS
。同一個標記可多次提供。這在認證 IMEI 時很有用,例如一個裝置可以有多個無線電和多個 IMEI 的無線電。如果每個 ATTESTATION_ID_IMEI
提供的值與裝置的其中一個無線電相符,認證要求就有效。所有其他標記也適用相同的做法。
如果認證成功,系統會使用上述結構定義,將認證 ID 新增至已核發認證憑證的認證擴充功能 (OID 1.3.6.1.4.1.11129.2.1.17)。與 Keymaster 2 認證結構定義的變更內容會以粗體字顯示,並附上註解。
Java API
本節僅供參考。Keymaster 實作者既不會實作也不會使用 Java API。此編號可協助實作者瞭解應用程式如何使用該功能。系統元件可能會以不同的方式使用它,因此請務必不要將本節視為規範。