设备标识符组合引擎 (DICE) 是一个 可信计算组 (TCG) 规范,已被 Android 采用。它为启动序列期间加载的每个固件片段创建一组强大的、不可变的加密身份。这些身份支持远程验证设备的安全状态,只有通过破坏 ROM 才能规避这种验证。
DICE 派生过程
图 1. 简化的 DICE 派生过程。
DICE 派生过程确保对任何固件映像的任何更改都会导致该阶段及之后每个阶段的新唯一标识符。这是因为每个加载的固件阶段都会测量并验证下一个阶段,从而生成唯一的身份和关联密钥,以防止绕过或篡改。 只读存储器 (ROM) 处理测量、配置和唯一设备密钥 (UDS),并使用密钥派生函数 (KDF) 派生要加载的下一阶段的密钥。此密钥称为复合设备标识符 (CDI)。
阶段 0:初始化
DICE 过程从芯片组的 ROM 从不可变数据组(通常是熔丝)加载 UDS 开始。此 UDS 已安全配置,在芯片生产过程中使用加密随机值。读取 UDS 后,ROM 使用供应商相关的硬件锁定机制(如锁存器)来锁定 UDS 访问,直到下次启动。
阶段 1:初始密钥派生
ROM 使用 UDS 作为输入到一个 密钥派生函数 (KDF),以生成唯一标识该设备的永久非对称密钥对。它测量下一个固件阶段,包括有关启动环境的元数据,例如是否启用了安全启动。然后,ROM 将 UDS、固件测量和配置数据组合在 KDF 中,以派生第一个 CDI,该 CDI 作为密钥传递到下一阶段。
阶段 2 到 n:递归密钥派生
然后重复该过程。在所有后续阶段中,前一阶段的 CDI 用作新 KDF 的输入。此 KDF 使用 CDI 和下一个固件映像的哈希,以生成新的派生 CDI。每个阶段都会生成自己的密钥对,并使用它来签署证书,其中包含特定于阶段的测量和其他关联的元数据。