Keystore 提供更安全的位置,可讓您以受控方式建立、儲存及使用加密金鑰。如果使用硬體支援的金鑰儲存空間,金鑰內容就不容易從裝置中擷取,且 KeyMint (先前為 Keymaster) 會強制執行難以規避的限制。
不過,只有在 Keystore 金鑰位於硬體支援儲存空間時,這項說法才成立。在 Keymaster 1 中,應用程式或遠端伺服器無法可靠地驗證是否為這種情況。金鑰儲存空間精靈載入可用的 Keymaster 硬體抽象層 (HAL),並相信 HAL 針對金鑰硬體支援所說的任何內容。
為解決這個問題,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,用來建立認證。attestParams
是驗證所需的任何參數清單。包括Tag::ATTESTATION_CHALLENGE
和Tag::RESET_SINCE_ID_ROTATION
(可能),以及Tag::APPLICATION_ID
和Tag::APPLICATION_DATA
。如果是在金鑰產生期間指定,則後兩者是解密金鑰 Blob 的必要條件。certChain
是輸出參數,會傳回憑證陣列。項目 0 是認證憑證,也就是認證keyToAttest
中的金鑰,並包含認證擴充功能。
attestKey
方法視為經過認證的金鑰的公開金鑰作業,因為隨時可以呼叫,且不需要符合授權限制。舉例來說,如果經過認證的金鑰需要使用者驗證才能使用,則可產生認證,不必進行使用者驗證。
認證證明
認證憑證是標準的 X.509 憑證,其中包含認證擴充功能 (選用),內含認證金鑰的說明。憑證會使用經過認證的認證金鑰簽署。驗證金鑰使用的演算法可能與要驗證的金鑰不同。
認證證明包含下表中的欄位,且不得包含任何額外欄位。部分欄位會指定固定欄位值。CTS 測試會驗證憑證內容是否完全符合定義。
憑證 SEQUENCE
欄位名稱 (請參閱 RFC 5280) | 值 |
---|---|
tbsCertificate | TBSCertificate SEQUENCE |
signatureAlgorithm | 用來簽署金鑰的演算法 AlgorithmIdentifier: EC 金鑰使用 ECDSA,RSA 金鑰使用 RSA。 |
signatureValue | BIT STRING,在 ASN.1 DER 編碼的 tbsCertificate 上計算的簽章。 |
TBSCertificate SEQUENCE
欄位名稱 (請參閱 RFC 5280) | 值 |
---|---|
version |
INTEGER 2 (表示 v3 憑證) |
serialNumber |
INTEGER 1 (固定值:所有認證都相同) |
signature |
用於簽署金鑰的演算法 AlgorithmIdentifier:EC 金鑰為 ECDSA,RSA 金鑰為 RSA。 |
issuer |
與批次認證金鑰的主體欄位相同。 |
validity |
兩個日期的 SEQUENCE,包含 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 表示,其中包含認證 SEQUENCE 的 DER 編碼。 |
認證延期
attestation
擴充功能包含 OID 1.3.6.1.4.1.11129.2.1.17
。當中包含經過認證的金鑰組資訊,以及金鑰產生時的裝置狀態。
AIDL 介面規格中定義的 Keymaster/KeyMint 標記類型會轉換為 ASN.1 類型,如下所示:
KeyMint 或 Keymaster 類型 | 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 GMT 算起的毫秒數。 |
BOOL |
NULL |
有標記表示為 true,沒有標記表示為 false。 |
BIGNUM |
沒有任何代碼屬於這個類型,因此未定義任何對應。 | |
BYTES |
OCTET_STRING |
結構定義
認證擴充功能內容由下列 ASN.1 結構定義說明:
版本 400
KeyDescription ::= SEQUENCE { attestationVersion 400, 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, moduleHash [724] 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), }
版本 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 結構定義版本。
值 KeyMint 或 Keymaster 版本 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 版 400 KeyMint 4.0 版 -
attestationSecurityLevel
-
儲存經過認證金鑰的位置安全性等級。
-
keymasterVersion
/keyMintVersion
-
KeyMint 或 Keymaster HAL 實作項目的版本。
值 KeyMint 或 Keymaster 版本 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 版 400 KeyMint 4.0 版 -
keymasterSecurityLevel
/keyMintSecurityLevel
- KeyMint 或 Keymaster 實作的安全等級。
-
attestationChallenge
- 金鑰產生時提供的驗證問題。
-
uniqueId
- 隱私權敏感的裝置 ID,系統應用程式可在金鑰產生時要求。如果未要求專屬 ID,這個欄位會留空。 詳情請參閱「專屬 ID」一節。
-
softwareEnforced
-
由 Android 系統強制執行的 KeyMint 或 Keymaster 授權清單。這項資訊是由平台中的程式碼收集或產生。只要裝置執行的作業系統符合 Android 平台安全模式,也就是裝置的系統啟動載入程式已鎖定,且
verifiedBootState
為Verified
,即可信任裝置。 -
hardwareEnforced
- 由裝置的受信任執行環境 (TEE) 或 StrongBox 強制執行的 KeyMint 或 Keymaster 授權清單。 這項資訊是由安全硬體中的程式碼收集或產生,平台無法控制。舉例來說,資訊可能來自系統啟動載入程式,或透過不涉及信任平台的安全通訊管道取得。
SecurityLevel 值
SecurityLevel
值表示與金鑰儲存區相關的元素 (例如金鑰配對和認證) 對於攻擊的抵抗程度。
值 | 意義 |
---|---|
Software |
只要裝置的 Android 系統符合 Android 平台安全防護模型 (也就是裝置的系統啟動載入程式已鎖定,且 verifiedBootState 為 Verified ),裝置就是安全的。 |
TrustedEnvironment |
只要 TEE 未遭入侵,就能確保安全。Android 相容性定義說明文件第 9.11 節 [C-1-1] 至 [C-1-4] 定義了 TEE 的隔離要求。TEE 可強力抵禦遠端入侵,並適度抵禦直接硬體攻擊造成的入侵。 |
StrongBox |
只要 StrongBox 未遭入侵,就能確保安全。StrongBox 是在類似於硬體安全模組的安全元件中實作。Android 相容性定義說明文件第 9.11.2 節定義了 StrongBox 的實作需求。StrongBox 能有效抵禦遠端入侵,以及直接硬體攻擊 (例如實體竄改和旁路攻擊)。 |
AuthorizationList 欄位
每個欄位都會對應至 AIDL 介面規格中的 Keymaster/KeyMint 授權標記。授權標記的真理來源是規格:標記的意義、內容格式、是否應出現在 KeyDescription
物件的 softwareEnforced
或 hardwareEnforced
欄位、是否與其他標記互斥等。所有 AuthorizationList
欄位皆為選填。
每個欄位都有一個 EXPLICIT
內容專屬標記,等於 KeyMint 或 Keymaster 標記編號,可讓 AuthorizationList
中的資料以更精簡的方式呈現。因此,ASN.1 剖析器必須知道每個情境專屬標記的預期資料類型。舉例來說,Tag::USER_AUTH_TYPE
定義為 ENUM | 504
。在認證擴充功能結構定義中,purpose
欄位會指定為 userAuthType [504] EXPLICIT INTEGER OPTIONAL
。AuthorizationList
因此,ASN.1 編碼會包含內容專屬標記 504
,而非 ASN.1 型別 INTEGER
的 UNIVERSAL
類別標記,也就是 10
。
-
purpose
-
對應至使用標記 ID 值 1 的
Tag::PURPOSE
授權標記。 -
algorithm
-
對應至使用標記 ID 值 2 的
Tag::ALGORITHM
授權標記。在認證
AuthorizationList
物件中,演算法的值一律為RSA
或EC
。 -
keySize
-
對應至使用標記 ID 值 3 的
Tag::KEY_SIZE
授權標記。 -
blockMode
-
對應至使用標記 ID 值 4 的
Tag::BLOCK_MODE
授權標記。 -
digest
-
對應至使用標記 ID 值 5 的
Tag::DIGEST
授權標記。 -
padding
-
對應至使用標記 ID 值 6 的
Tag::PADDING
授權標記。 -
callerNonce
-
對應至使用標記 ID 值 7 的
Tag::CALLER_NONCE
授權標記。 -
minMacLength
-
對應至使用標記 ID 值 8 的
Tag::MIN_MAC_LENGTH
授權標記。 -
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
授權標記。 -
usageExpireDateTime
-
對應至使用標記 ID 值 402 的
Tag::USAGE_EXPIRE_DATETIME
授權標記。 -
usageCountLimit
-
對應至使用標記 ID 值 405 的
Tag::USAGE_COUNT_LIMIT
授權標記。 -
userSecureId
-
對應至使用標記 ID 值 502 的
Tag::USER_SECURE_ID
授權標記。 -
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
授權標記。如果使用者仍將裝置戴在身體上,則允許金鑰在驗證逾時後繼續使用。請注意,安全的人體感應器可判斷裝置是否戴在使用者的身體上。
-
trustedUserPresenceReq
-
只存在於金鑰認證 3 以上版本中。
對應至使用標記 ID 值 507 的
Tag::TRUSTED_USER_PRESENCE_REQUIRED
授權標記。指定只有在使用者已提供實際存在證明的情況下,這個金鑰才能使用。以下提供幾個範例:
- 如果是 StrongBox 金鑰,硬體按鈕會以有線方式連接至 StrongBox 裝置上的 PIN 碼。
- 如果是 TEE 金鑰,只要 TEE 擁有掃描器的專屬控制權,並執行指紋比對程序,指紋驗證功能就會提供存在證明。
-
trustedConfirmationReq
-
只存在於金鑰認證 3 以上版本中。
對應至使用標記 ID 值 508 的
Tag::TRUSTED_CONFIRMATION_REQUIRED
授權標記。指定只有在使用者確認要透過已核准權杖簽署資料時,金鑰才能使用。如要進一步瞭解如何取得使用者確認,請參閱「Android 保護確認」。
注意:這個標記僅適用於
SIGN
用途的金鑰。 -
unlockedDeviceReq
-
只存在於金鑰認證 3 以上版本中。
對應至使用標記 ID 值 509 的
Tag::UNLOCKED_DEVICE_REQUIRED
授權標記。 -
creationDateTime
-
對應至使用標記 ID 值 701 的
Tag::CREATION_DATETIME
授權標記。 -
origin
-
對應至使用標記 ID 值 702 的
Tag::ORIGIN
授權標記。 -
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
授權標記。詳情請參閱說明 AttestationApplicationId 資料結構的章節。
-
attestationIdBrand
-
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 710 的
Tag::ATTESTATION_ID_BRAND
授權標記。 -
attestationIdDevice
-
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 711 的
Tag::ATTESTATION_ID_DEVICE
授權標記。 -
attestationIdProduct
-
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 712 的
Tag::ATTESTATION_ID_PRODUCT
授權標記。 -
attestationIdSerial
-
只存在於金鑰認證 2 以上版本中。
對應至使用標記 ID 值 713 的
Tag::ATTESTATION_ID_SERIAL
授權標記。 -
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
授權標記。 -
moduleHash
-
只存在於金鑰認證 400 以上版本中。
對應至使用標記 ID 值 724 的
Tag::MODULE_HASH
授權標記。
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 時,這組 ID 才能包含多個套件。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]), ...}
佈建資訊擴充功能
佈建資訊擴充資料包含 OID 1.3.6.1.4.1.11129.2.1.30
。此擴充資料可透過佈建伺服器提供已知的裝置資訊。
結構定義
擴充功能符合下列 CDDL 結構定義:
{ 1 : int, ; certificates issued 4 : string, ; validated attested entity (STRONG_BOX/TEE) }
對應內容並非版本,因此可加入新的選用欄位。
-
certs_issued
-
過去 30 天內核發給裝置的憑證數量約略值。如果此值大於特定數量級的平均值,則可用來當做潛在濫用信號。
-
validated_attested_entity
-
經過驗證的認證實體是字串,用於說明由佈建伺服器確認已認證的裝置類型。例如
STRONG_BOX
或TEE
。
認證金鑰
系統會將兩把金鑰 (RSA 和 ECDSA 各一) 和對應的憑證鏈安全佈建到裝置中。
Android 12 推出遠端金鑰佈建功能,Android 13 則要求裝置實作這項功能。遠端金鑰佈建功能可為現場裝置提供每個應用程式的 ECDSA P256 認證憑證。這類憑證的效期比原廠佈建的憑證短。
專屬 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_params 參數中存在
Tag::RESET_SINCE_ID_ROTATION
,則R
為 1;如果不存在,則為 0。 HBK
是受信任執行環境所知的唯一硬體繫結密碼,且絕不會由該環境揭露。這個密碼至少包含 128 位元的熵,且每個裝置都有專屬密碼 (考量到 128 位元的熵,機率上的唯一性是可以接受的)。HBK 應透過 HMAC 或 AES_CMAC 從融合金鑰材料衍生。
將 HMAC_SHA256 輸出內容截斷為 128 位元。
多個 IMEI
Android 14 在 Android 金鑰認證記錄中新增多個 IMEI 支援。原始設備製造商 (OEM) 可以為第二個 IMEI 新增 KeyMint 標記,藉此實作這項功能。 裝置配備多個行動無線電越來越常見,原始設備製造商現在可以支援具有兩個 IMEI 的裝置。
如果 OEM 裝置有次要 IMEI,則必須將該 IMEI 佈建至 KeyMint 實作項目,以便這些實作項目以與驗證第一個 IMEI 相同的方式驗證次要 IMEI。
ID 認證
Android 8.0 支援裝置 ID 認證 (選用),適用於搭載 Keymaster 3 的裝置。ID 認證可讓裝置提供硬體 ID 的證明,例如序號或 IMEI。雖然這項功能是選用功能,但強烈建議所有 Keymaster 3 實作項目都提供支援,因為能夠證明裝置身分可實現許多用途,例如更安全的零接觸式遠端設定 (因為遠端可以確定與正確裝置通訊,而非身分遭偽造的裝置)。
ID 認證機制會建立裝置硬體 ID 的副本,只有 TEE 才能在裝置出廠前存取這些副本。使用者可以解鎖裝置的開機載入程式,並變更系統軟體和 Android 架構回報的 ID。TEE 持有的 ID 副本無法以這種方式操控,確保裝置 ID 認證只會認證裝置的原始硬體 ID,進而防範假冒嘗試。
ID 認證的主要 API 介面是以 Keymaster 2 導入的現有金鑰認證機制為基礎建構而成。要求 Keymaster 持有的金鑰認證憑證時,呼叫端可以要求將裝置的硬體 ID 納入認證憑證的中繼資料。如果金鑰保留在 TEE 中,憑證會鏈結回已知的信任根。這類憑證的收件者可以驗證憑證及其內容 (包括硬體 ID) 是否由 TEE 撰寫。如果系統要求在認證憑證中加入硬體 ID,TEE 只會認證儲存空間中保存的 ID,這些 ID 是在工廠中填入。
儲存空間屬性
儲存裝置 ID 的儲存空間必須具備下列屬性:
- 裝置離開工廠前,系統會將衍生自原始 ID 的值複製到儲存空間。
destroyAttestationIds()
方法可以永久刪除這個衍生自 ID 的資料副本。永久銷毀是指徹底移除資料,因此無論將裝置恢復原廠設定或執行任何其他程序,都無法還原資料。如果使用者已解鎖啟動載入程式、變更系統軟體,以及修改 Android 架構傳回的 ID,這點就特別重要。- RMA 設施應能產生硬體 ID 衍生資料的全新副本。這樣一來,通過 RMA 的裝置就能再次執行 ID 認證。退貨授權機構使用的機制必須受到保護,使用者不得自行叫用,否則他們就能取得偽造 ID 的認證。
- TEE 中除了 Keymaster 信任的應用程式外,沒有任何程式碼可以讀取儲存在儲存空間中的 ID 衍生資料。
- 儲存空間具有防竄改功能:如果儲存空間的內容遭到修改,TEE 會將其視為內容副本已毀損,並拒絕所有 ID 認證嘗試。方法是簽署或 MAC 儲存空間,如下所述。
- 儲存空間不會保留原始 ID。由於 ID 認證涉及驗證問題,因此呼叫者一律會提供要認證的 ID。TEE 只需要驗證這些值是否與原始值相符。儲存原始值的安全雜湊,而非值本身,即可進行這項驗證。
營造業
如要建立具有上述屬性的實作項目,請在下列建構函式 S 中儲存 ID 衍生值。請勿儲存 ID 值的其他副本,但系統中的正常位置除外,裝置擁有者可透過 Root 存取這些位置並修改 ID 值:
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
回傳的產品名稱 - Android 中
Build.MANUFACTURER
傳回的製造商名稱 - Android 中
Build.MODEL
傳回的機型名稱 - 序號
- 所有無線電的 IMEI
- 所有無線電的 MEID
如要支援裝置 ID 認證,裝置必須認證這些 ID。所有搭載 Android 的裝置都有前六個,且必須具備這些項目,這項功能才能運作。如果裝置內建任何行動無線電,裝置也必須支援無線電的 IMEI 和/或 MEID 認證。
如要要求 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。提供這項資訊,是為了協助實作者瞭解應用程式如何使用這項功能。系統元件可能會以不同方式使用,因此請務必不要將本節視為規範。