密钥认证和 ID 认证

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_IDTag::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_DATETIMETag::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::SIGNKeyPurpose::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 版本
1Keymaster 版本 2.0
2Keymaster 版本 3.0
3Keymaster 版本 4.0
4Keymaster 版本 4.1
100KeyMint 版本 1.0
200KeyMint 版本 2.0
300KeyMint 版本 3.0
attestationSecurityLevel

存储经过认证的密钥的位置的安全级别

keymasterVersion/keyMintVersion
Keymaster/KeyMint 硬件抽象层 (HAL) 实现的版本。
Keymaster/KeyMint 版本
2Keymaster 版本 2.0
3Keymaster 版本 3.0
4Keymaster 版本 4.0
41Keymaster 版本 4.1
100KeyMint 版本 1.0
200KeyMint 版本 2.0
300KeyMint 版本 3.0
keymasterSecurityLevel/keyMintSecurityLevel
Keymaster/KeyMint 实现的安全等级
attestationChallenge
在密钥生成时提供的质询。
uniqueId
系统应用可以在密钥生成时请求的隐私敏感设备标识符。如果未请求唯一 ID,则此字段为空。如需了解详情,请参阅唯一 ID 部分。
softwareEnforced
由 Android 系统强制执行的 Keymaster/KeyMint 授权列表。此信息由平台中的代码收集或生成,并存储在设备的系统分区中。只要设备运行的操作系统符合 Android 平台安全模型(即设备的引导加载程序处于锁定状态,并且 verifiedBootStateVerified),就可以信任该设备。
hardwareEnforced
由设备的可信执行环境 (TEE) 或 StrongBox 强制执行的 Keymaster/KeyMint 授权列表。此类信息由安全硬件中的代码收集或生成,不受平台控制。例如,信息可以来自引导加载程序,也可以通过不涉及信任平台的安全通信渠道传输。

SecurityLevel 值

SecurityLevel 值表示密钥库相关元素(例如密钥对和证明)对攻击的抵御能力。

含义
Software 只要设备的 Android 系统符合 Android 平台安全模型(即设备的引导加载程序处于锁定状态,并且 verifiedBootStateVerified),设备就属于安全状态。
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 对象的 softwareEnforcedhardwareEnforced 字段中、是否与其他标记互斥,等等。所有 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 类型 INTEGERUNIVERSAL 类标记(即 10)。

purpose
Tag::PURPOSE 授权标记对应,其使用的标记 ID 值为 1。
algorithm

Tag::ALGORITHM 授权标记对应,其使用的标记 ID 值为 2。

在认证 AuthorizationList 对象中,算法值始终为 RSAEC

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)。
  • CTag::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 认证支持以下硬件标识符:

  1. 品牌名称,由 Android 中的 Build.BRAND 返回
  2. 设备名称,由 Android 中的 Build.DEVICE 返回
  3. 产品名称,由 Android 中的 Build.PRODUCT 返回
  4. 制造商名称,由 Android 中的 Build.MANUFACTURER 返回
  5. 型号名称,由 Android 中的 Build.MODEL 返回
  6. 序列号
  7. 所有无线装置的 IMEI
  8. 所有无线装置的 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 是为了帮助实现人员了解应用如何使用该功能。系统组件可能会以各种不同方式使用该功能,这就是我们不将本部分作为规范的重要原因。