Androrid KeyStore, KeyStore TA (三)

Keystore 提供了一个更安全的位置,让您能够以可控方式创建、存储和使用加密密钥。如果有硬件

支持的密钥存储区可用,则使用该存储区比从设备中提取密钥材料更安全,并且 Keymaster 强制执行

的限制会更难以打破。

不过,仅当已知 Keystore 密钥位于由硬件支持的存储区中时,才能够实现这一点。在 Keymaster 1 中,

应用或远程服务器无法可靠地验证是否属于这种情况。Keystore 守护进程加载可用的 Keymaster HAL

并相信 HAL 对于密钥硬件支持的任何判断。

为了解决此问题,Keymaster Android 7.0 (Keymaster 2) 中引入了密钥认证,在 Android 8.0 

(Keymaster 3) 中引入了ID 认证

密钥认证旨在提供一种方式,可让您明确地确定某个不对称密钥对是否由硬件支持、该密钥有哪些属性,

及其使用具有哪些限制条件。

通过ID 认证,设备可以提供其硬件标识符的证明,例如序列号或 IMEI

ID 认证

Android 8.0 为使用 Keymaster 3 的设备提供了对 ID 认证的可选支持。通过 ID 认证,设备可以提供其硬

件标识符的证明,例如序列号或 IMEI。虽然这是可选功能,但强烈建议所有 Keymaster 3 实现提供对该功

能的支持,因为能够证明设备的身份可确保真正的零触摸远程配置等用例更加安全(因为远程端可以确定与

它进行对话的是正确的设备,而非假冒其身份的设备)。

ID 认证的工作原理如下:在设备出厂之前创建只有可信执行环境(TEE)才能访问的设备硬件标识符的副本。

用户可以解锁设备的引导加载程序,并更改系统软件以及 Android 框架所报告的标识符。由 TEE 保存的

标识符的副本不会以这种方式被操控,这样可确保设备 ID认证仅用于证明设备的原始硬件标识符,从而阻

止尝试假冒身份的操作。

ID 认证的主要 API 表面基于 Keymaster 2 中引入的现有密钥认证机制构建而成。在为 Keymaster 所保存

的密钥请求认证证书时,调用程序可能会要求将该设备的硬件标识符包含在认证证书的元数据中。如果密钥

保存在 TEE 中,该证书会链接回一个已知的信任根。此类证书的接收方可以验证该证书及其内容(包括硬件

标识符)是否由 TEE 所编写。如果调用程序要求在认证证书中包硬件标识符TEE 仅证明其存储区中保存

的标识符,正如在工厂车间进行填充一样。 

存储区属性

保存设备标识符的存储区需要具有以下属性:

·        在设备出厂之前,将设备的原始标识符派生的值复制到存储区中。

·        destroyAttestationIds() 方法可以永久破坏该标识符所派生数据的副本。永久破坏意味着数据会被彻

底移除,无论是恢复出厂设置还是在设备上执行任何其他程序都无法将其恢复。对于用户已解锁引导加载

程序并更改了系统软件以及 Android 框架返回的标识符的设备而言,这一点尤其重要。

·        RMA 设施应该能够生成硬件标识符派生数据的新副本。这样一来,通过 RMA 的设备可以再次执

ID 认证。必须保护 RMA 设施使用的机制,从而使用户无法自行调用,因为调用该机制会导致用户完成对

假冒 ID 的认证。

·         TEE 中,除了Keymaster 可信应用之外的所有代码都无法读取存储区中保存的标识符派生数据。

·        存储区可以防篡改:如果存储区的内容已遭到修改,TEE 会将其视为相应内容的副本已被破坏,并会拒绝

尝试进行 ID 认证的所有操作。这通过对存储区执行签名或 MAC 来实现(如下所述)。

·        存储区不保存原始标识符。由于 ID 认证涉及到一项质询,因此调用程序始终需要提供要进行认证的

标识符。 TEE 只需验证这些标识符是否与其原始值相匹配即可。只要存储了原始值的安全哈希(而不

是值本身),即可进行此验证

硬件标识符

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 添加到已颁发认证证书认证扩展 (OID1.3.6.1.

4.1.11129.2.1.17)Keymaster 2 认证架构发生的变更以粗体显示,并带有注释。


猜你喜欢

转载自blog.csdn.net/junwua/article/details/80519564