Keystore 提供了一个更安全的位置,让您能够以可控方式创建、存储和使用加密密钥。如果由硬件支持的密钥存储区可用,则使用该存储区比从设备中提取密钥材料更安全,并且 Keymaster 强制执行的限制会更难以打破。
不过,仅当已知 Keystore 密钥位于由硬件支持的存储区中时,才能够实现这一点。在 Keymaster 1 中,应用或远程服务器无法可靠地验证是否属于这种情况。Keystore 守护程序加载可用的 Keymaster HAL,并相信 HAL 对于密钥硬件支持的任何判断。
为了解决此问题,Keymaster 在 Android 7.0 (Keymaster 2) 中引入了密钥认证,在 Android 8.0 (Keymaster 3) 中引入了 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 测试会验证证书内容是否与所定义的内容完全一致。
证书序列
字段名称(请参见 RFC 5280) | 值 |
---|---|
tbsCertificate | TBSCertificate 序列 |
signatureAlgorithm | 用于签署密钥的算法的 AlgorithmIdentifier: ECDSA 用于 EC 密钥,RSA 用于 RSA 密钥。 |
signatureValue | BIT STRING,在 ASN.1 DER 编码的 tbsCertificate 上计算的签名。 |
TBSCertificate 序列
字段名称(请参见 RFC 5280) | 值 |
---|---|
version |
INTEGER 2(表示 v3 证书) |
serialNumber |
INTEGER 1(固定值:所有证书上的值都相同) |
signature |
用于签署密钥的算法的 AlgorithmIdentifier:ECDSA 用于 EC 密钥,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 |
值待定 |
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 日 GMT 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 部分。
-
softwareEnforced
-
由 Android 系统强制执行的 Keymaster/KeyMint 授权列表。此信息由平台中的代码收集或生成,并存储在设备的系统分区中。只要设备运行的操作系统符合 Android 平台安全模型(即设备的引导加载程序处于锁定状态,并且
verifiedBootState
为Verified
),就可以信任该设备。 -
hardwareEnforced
- 由设备的可信执行环境 (TEE) 或 StrongBox 强制执行的 Keymaster/KeyMint 授权列表。此类信息由安全硬件中的代码收集或生成,不受平台控制。例如,信息可以来自引导加载程序,也可以通过不涉及信任平台的安全通信渠道传输。
SecurityLevel 值
SecurityLevel
值表示密钥库相关元素(例如密钥对和证明)对攻击的抵御能力。
值 | 含义 |
---|---|
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
。在 attestation 扩展架构中,AuthorizationList
中的 purpose
字段被指定为 userAuthType [504] EXPLICIT INTEGER OPTIONAL
。因此,其 ASN.1 编码将包含特定于上下文的标记 504
,而不是 ASN.1 类型 INTEGER
的 UNIVERSAL
类标记(即 10
)。
-
purpose
-
与
Tag::PURPOSE
授权标记对应,其使用的标记 ID 值为 1。 -
algorithm
-
与
Tag::ALGORITHM
授权标记对应,其使用的标记 ID 值为 2。在认证
AuthorizationList
对象中,算法值始终为RSA
或EC
。 -
keySize
-
与
Tag::KEY_SIZE
授权标记对应,其使用的标记 ID 值为 3。 -
digest
-
与
Tag::DIGEST
授权标记对应,其使用的标记 ID 值为 5。 -
padding
-
与
Tag::PADDING
授权标记对应,其使用的标记 ID 值为 6。 -
ecCurve
-
与
Tag::EC_CURVE
授权标记对应,其使用的标记 ID 值为 10。Android 系统密钥库中用于生成椭圆曲线 (EC) 密钥对的参数集,该参数集使用 ECDSA 进行签名和验证。
-
rsaPublicExponent
-
与
Tag::RSA_PUBLIC_EXPONENT
授权标记对应,其使用的标记 ID 值为 200。 -
mgfDigest
-
仅存在于密钥认证版本 100 或更高版本中。
与Tag::RSA_OAEP_MGF_DIGEST
KeyMint 授权标记对应,其使用的标记 ID 值为 203。 -
rollbackResistance
-
仅存在于密钥认证版本 3 或更高版本中。
与
Tag::ROLLBACK_RESISTANCE
授权标记对应,其使用的标记 ID 值为 303。 -
earlyBootOnly
-
仅存在于密钥认证版本 4 或更高版本中。
与
Tag::EARLY_BOOT_ONLY
授权标记对应,其使用的标记 ID 值为 305。 -
activeDateTime
-
与
Tag::ACTIVE_DATETIME
授权标记对应,其使用的标记 ID 值为 400。 -
originationExpireDateTime
-
与
Tag::ORIGINATION_EXPIRE_DATETIME
授权标记对应,其使用的标记 ID 值为 401。 -
usageExpireDateTime
-
与
Tag::USAGE_EXPIRE_DATETIME
授权标记对应,其使用的标记 ID 值为 402。 -
usageCountLimit
-
与
Tag::USAGE_COUNT_LIMIT
授权标记对应,其使用的标记 ID 值为 405。 -
noAuthRequired
-
与
Tag::NO_AUTH_REQUIRED
授权标记对应,其使用的标记 ID 值为 503。 -
userAuthType
-
与
Tag::USER_AUTH_TYPE
授权标记对应,其使用的标记 ID 值为 504。 -
authTimeout
-
与
Tag::AUTH_TIMEOUT
授权标记对应,其使用的标记 ID 值为 505。 -
allowWhileOnBody
-
与
Tag::ALLOW_WHILE_ON_BODY
授权标记对应,其使用的标记 ID 值为 506。如果用户身上仍佩戴着设备,允许在密钥身份验证超时后使用密钥。请注意,安全的体感传感器可以确定设备是否正佩戴在用户身上。
-
trustedUserPresenceRequired
-
仅存在于密钥认证版本 3 或更高版本中。
与
Tag::TRUSTED_USER_PRESENCE_REQUIRED
授权标记对应,其使用的标记 ID 值为 507。规定仅在用户提供了物理存在证明时,此密钥才可用。以下是此类情况的几个示例:
- 对于 StrongBox 密钥,以硬连接的方式将硬件按钮连接到 StrongBox 设备上的 PIN 码。
- 对于 TEE 密钥,只要 TEE 拥有对扫描器的独占控制权并执行指纹匹配过程,指纹身份验证就会提供存在证明。
-
trustedConfirmationRequired
-
仅存在于密钥认证版本 3 或更高版本中。
与
Tag::TRUSTED_CONFIRMATION_REQUIRED
授权标记对应,其使用的标记 ID 值为 508。规定仅在用户确认使用审批令牌为数据签名时,此密钥才可用。如需详细了解如何获取用户确认,请参阅 Android Protected Confirmation。
注意:此标记仅适用于目的为
SIGN
的密钥。 -
unlockedDeviceRequired
-
仅存在于密钥认证版本 3 或更高版本中。
与
Tag::UNLOCKED_DEVICE_REQUIRED
授权标记对应,其使用的标记 ID 值为 509。 -
allApplications
-
与
Tag::ALL_APPLICATIONS
授权标记对应,其使用的标记 ID 值为 600。指示设备上的所有应用是否都可以访问密钥对。
-
applicationId
-
与
Tag::APPLICATION_ID
授权标记对应,其使用的标记 ID 值为 601。 -
creationDateTime
-
与
Tag::CREATION_DATETIME
授权标记对应,其使用的标记 ID 值为 701。 -
origin
-
与
Tag::ORIGIN
授权标记对应,其使用的标记 ID 值为 702。 -
rollbackResistant
-
仅存在于密钥认证版本 1 和 2 中。
与
Tag::ROLLBACK_RESISTANT
授权标记对应,其使用的标记 ID 值为 703。 -
rootOfTrust
-
与
Tag::ROOT_OF_TRUST
授权标记对应,其使用的标记 ID 值为 704。如需了解更多详情,请参阅介绍 RootOfTrust 数据结构的部分。
-
osVersion
-
与
Tag::OS_VERSION
授权标记对应,其使用的标记 ID 值为 705。与 Keymaster 关联的 Android 操作系统的版本,使用一个 6 位整数表示。例如,版本 8.1.0 表示为 080100。
只有 Keymaster 版本 1.0 或更高版本在授权列表中包含此值。
-
osPatchLevel
-
与
Tag::PATCHLEVEL
授权标记对应,其使用的标记 ID 值为 706。与 Keymaster 中使用的安全补丁关联的月份和年度,使用一个 6 位整数表示。例如,2018 年 8 月的补丁表示为 201808。
只有 Keymaster 版本 1.0 或更高版本在授权列表中包含此值。
-
attestationApplicationId
-
仅存在于密钥认证版本 2 或更高版本中。
与
Tag::ATTESTATION_APPLICATION_ID
授权标记对应,其使用的标记 ID 值为 709。如需了解更多详情,请参阅介绍 AttestationApplicationId 数据结构的部分。
-
attestationIdBrand
-
仅存在于密钥认证版本 2 或更高版本中。
与
Tag::ATTESTATION_ID_BRAND
Keymaster 标记对应,其使用的标记 ID 值为 710。 -
attestationIdDevice
-
仅存在于密钥认证版本 2 或更高版本中。
与
Tag::ATTESTATION_ID_DEVICE
Keymaster 标记对应,其使用的标记 ID 值为 711。 -
attestationIdProduct
-
仅存在于密钥认证版本 2 或更高版本中。
与
Tag::ATTESTATION_ID_PRODUCT
Keymaster 标记对应,其使用的标记 ID 值为 712。 -
attestationIdSerial
-
仅存在于密钥认证版本 2 或更高版本中。
与
Tag::ATTESTATION_ID_SERIAL
Keymaster 标记对应,其使用的标记 ID 值为 713。 -
attestationIdImei
-
仅存在于密钥认证版本 2 或更高版本中。
与
Tag::ATTESTATION_ID_IMEI
授权标记对应,其使用的标记 ID 值为 714。 -
attestationIdMeid
-
仅存在于密钥认证版本 2 或更高版本中。
与
Tag::ATTESTATION_ID_MEID
授权标记对应,其使用的标记 ID 值为 715。 -
attestationIdManufacturer
-
仅存在于密钥认证版本 2 或更高版本中。
与
Tag::ATTESTATION_ID_MANUFACTURER
授权标记对应,其使用的标记 ID 值为 716。 -
attestationIdModel
-
仅存在于密钥认证版本 2 或更高版本中。
与
Tag::ATTESTATION_ID_MODEL
授权标记对应,其使用的标记 ID 值为 717。 -
vendorPatchLevel
-
仅存在于密钥认证版本 3 或更高版本中。
与
Tag::VENDOR_PATCHLEVEL
授权标记对应,其使用的标记 ID 值为 718。规定为了使用此密钥而必须在设备上安装的供应商映像安全补丁级别。此值以 YYYYMMDD 的形式显示,表示供应商安全补丁的日期。例如,如果密钥在 Android 设备上生成,且相应设备安装了供应商于 2018 年 8 月 1 日提供的安全补丁,其值将表示为 20180801。
-
bootPatchLevel
-
仅存在于密钥认证版本 3 或更高版本中。
与
Tag::BOOT_PATCHLEVEL
授权标记对应,其使用的标记 ID 值为 719。规定为了使用此密钥而必须在设备上安装的内核映像安全补序级别。此值以 YYYYMMDD 的形式显示,表示系统安全补丁的日期。例如,如果密钥在 Android 设备上生成,且相应设备安装了系统于 2018 年 8 月 5 日提供的安全补丁,其值将表示为 20180805。
-
deviceUniqueAttestation
-
仅存在于密钥认证版本 4 或更高版本中。
与
Tag::DEVICE_UNIQUE_ATTESTATION
授权标记对应,其使用的标记 ID 值为 720。 -
attestationIdSecondImei
-
仅存在于密钥认证版本 300 或更高版本中。
与
Tag::ATTESTATION_ID_SECOND_IMEI
授权标记对应,其使用的标记 ID 值为 723。
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]), ...}
唯一 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 进行认证
配置信息扩展
配置信息扩展的 OID 为 1.3.6.1.4.1.11129.2.1.30
。该扩展可提供配置服务器已知的设备信息。
架构
该扩展遵循以下 CDDL 架构:
{ 1 : int, ; certificates issued }
该映射没有版本信息,可以添加新的可选字段。
-
certs_issued
-
过去 30 天内向设备颁发的证书的大致数量。如果此值比平均值大出几个数量级,则可以将其当作潜在滥用的信号。
ID 认证
Android 8.0 为使用 Keymaster 3 的设备提供了对 ID 认证的可选支持。通过 ID 认证,设备可以提供其硬件标识符的证明,例如序列号或 IMEI。虽然这是可选功能,但强烈建议所有 Keymaster 3 实现提供对该功能的支持,因为能够证明设备的身份可确保真正的零触摸远程配置等用例更加安全(因为远程端可以确定与它进行对话的是正确的设备,而非假冒其身份的设备)。
ID 认证的工作原理如下:在设备出厂之前,创建只有可信执行环境 (TEE) 才能访问的设备硬件标识符的副本。用户可以解锁设备的引导加载程序,并更改系统软件以及 Android 框架所报告的标识符。由 TEE 保存的标识符的副本不会以这种方式被操控,这样可确保设备 ID 认证仅用于证明设备的原始硬件标识符,从而阻止尝试假冒身份的操作。
ID 认证的主要 API Surface 基于 Keymaster 2 中引入的现有密钥认证机制构建而成。在为 Keymaster 所保存的密钥请求认证证书时,调用方可能会要求将设备的硬件标识符包含在认证证书的元数据中。如果密钥保存在 TEE 中,证书会链接回一个已知的信任根。此类证书的接收方可以验证该证书及其内容(包括硬件标识符)是否由 TEE 所编写。如果调用方要求在认证证书中包含硬件标识符,TEE 会仅证明其存储区中保存的标识符,正如在工厂车间进行填充一样。
存储区属性
保存设备标识符的存储区需要具有以下属性:
- 在设备出厂之前,将设备的原始标识符派生的值复制到存储区中。
destroyAttestationIds()
方法可以永久销毁该标识符所派生数据的副本。永久破坏意味着数据会被彻底移除,无论是恢复出厂设置还是在设备上执行任何其他程序都无法将其恢复。对于用户已解锁引导加载程序并更改了系统软件以及 Android 框架返回的标识符的设备而言,这一点尤其重要。- RMA 设施应该能够生成硬件标识符派生数据的新副本。这样一来,通过 RMA 的设备可以再次执行 ID 认证。必须保护 RMA 设施使用的机制,从而使用户无法自行调用,因为调用该机制会导致用户完成对假冒 ID 的认证。
- 在 TEE 中,除了 Keymaster 可信应用之外的所有代码都无法读取存储区中保存的标识符派生数据。
- 存储区可以防篡改:如果存储区的内容已遭到修改,TEE 会将其视为相应内容的副本已被破坏,并会拒绝尝试进行 ID 认证的所有操作。这通过对存储区执行签名或 MAC 来实现(如下所述)。
- 存储区不保存原始标识符。由于 ID 认证涉及到一项质询,因此调用方始终需要提供要进行认证的标识符。TEE 只需验证这些标识符是否与其原始值相匹配即可。只要存储了原始值的安全哈希(而不是值本身),即可进行此验证。
结构
如需创建具有上述属性的实现,请将 ID 派生的值存储在以下结构 S 中。请勿存储这些 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 值;特定值与特定索引之间的关联取决于实现,因为不同设备将具有不同数量的标识符||
表示串联
由于 HMAC 输出的大小是固定的,因此不需要标头或其他结构就能够查找单个 ID 哈希或 D 结构的 HMAC。实现不仅需要检查所收到的值以执行认证,还需要验证 S。验证 S 的方法是从 S 中提取 D,计算 HMAC(HBK、D),然后将计算结果与 S 中的值进行比较,从而确认没有任何单个 ID 遭到修改/损坏。此外,在实现过程中,对所有单个 ID 元素进行比较的时间都必须是固定不变的,并且必须对 S 进行验证。不论所提供的 ID 有多少,也不论测试的任何部分是否正确匹配,比较时间都必须是固定不变的。
硬件标识符
ID 认证支持以下硬件标识符:
- 品牌名称,由 Android 中的
Build.BRAND
返回 - 设备名称,由 Android 中的
Build.DEVICE
返回 - 产品名称,由 Android 中的
Build.PRODUCT
返回 - 制造商名称,由 Android 中的
Build.MANUFACTURER
返回 - 型号名称,由 Android 中的
Build.MODEL
返回 - 序列号
- 所有无线装置的 IMEI
- 所有无线装置的 MEID
为了支持设备 ID 认证,设备需要证明这些标识符。运行 Android 的所有设备都具有前 6 种标识符,它们是此功能正常发挥作用所必需的元素。如果设备具有任何集成的手机无线装置,那么还必须支持对无线装置的 IMEI 和/或 MEID 的认证。
通过执行密钥认证并在请求中添加要认证的设备标识符来请求 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
要证明的标识符是采用 UTF-8 编码的字节字符串。此格式也适用于数字标识符。要证明的每个标识符都表示为 UTF-8 编码的字符串。
如果该设备不支持 ID 认证(或者之前已调用 destroyAttestationIds()
且该设备不再证明其 ID),则任何包含以上一个或多个标记的密钥认证请求都会失败并显示 ErrorCode::CANNOT_ATTEST_IDS
。
如果该设备支持 ID 认证,并且密钥认证请求中包含以上一个或多个标记,TEE 会验证带有各个标记的标识符是否与其硬件标识符的副本相匹配。如果有一个或多个标识符不匹配,则整个认证都会失败并显示 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。我们提供 Java API 是为了帮助实现人员了解应用如何使用该功能。系统组件可能会以各种不同方式使用该功能,这就是我们不将本部分作为规范的重要原因。