TPM/TEE 基础:TPM 2.0 核心概念、TEE(TrustZone/SE)简介、PCR 寄存器与度量日志

各位好,咱们进入第二章。这一章是后面所有远程证明方案的“地基”。

说实话,我见过不少团队,上来就写代码调接口,结果 PCR 值对不上、度量日志解析失败,最后回头补 TPM/TEE 的课。嗯,咱们别走那个弯路。

TPM 2.0 核心概念

TPM 2.0 是什么?说白了,它是一个独立的硬件安全芯片,焊在主板上。它有自己的 CPU、ROM、RAM、非易失性存储,甚至还有真随机数发生器。

我习惯把 TPM 2.0 的能力归纳为三件事:

  • 安全存储:密钥生成在芯片内,私钥永远不离开 TPM。
  • 平台度量:记录系统启动过程中的每一个组件状态。
  • 远程证明:把度量结果签名后发给验证方。

TPM 2.0 相比 1.2 最大的变化是什么?算法灵活性。1.2 只支持 SHA-1 和 RSA,2.0 支持 SHA-256、ECC、SM3、SM4 等。我在一个国产化项目里就吃过 1.2 的亏,客户要求国密算法,TPM 1.2 根本跑不了,最后换了 2.0 才解决。

TPM 2.0 关键组件速览

组件 作用 避坑点
EK(Endorsement Key) TPM 出厂时烧录的身份密钥 EK 证书链必须可验证,否则远程证明无法建立信任根
SRK(Storage Root Key) 存储层次结构的根密钥 SRK 算法选择影响后续所有密钥的兼容性
PCR(Platform Configuration Registers) 存储度量值的寄存器 不同 PCR 索引有不同用途,别乱用
NVRAM 非易失性存储区 空间有限,写之前算好大小

我的习惯:拿到新设备,第一件事就是读取 EK 证书,确认它是由 TPM 厂商签发的。如果证书链断了,后面所有证明都是空中楼阁。

TEE 简介:TrustZone 与 SE

TEE(Trusted Execution Environment)是另一个思路。TPM 是独立芯片,TEE 是在主 CPU 里划出一块安全区域。

ARM TrustZone 把 CPU 分成两个世界:正常世界(Normal World)和安全世界(Secure World)。普通操作系统跑在正常世界,安全敏感操作跑在安全世界。两个世界通过 Monitor Mode 切换。

SE(Secure Element)则是更硬核的方案——一个独立的防篡改芯片,通常用在支付领域。SIM 卡、银行卡芯片都是 SE 的一种。

你想想看,这三者怎么选?

  • TPM:适合 PC、服务器,做平台完整性度量。
  • TrustZone:适合手机、IoT 设备,做运行时隔离。
  • SE:适合支付、身份认证,做最高等级的安全存储。

我在一个智能门锁项目里用过 TrustZone。当时客户要求密钥不能泄露,但设备没有 TPM 芯片。我们用 TrustZone 的 Secure World 存储密钥,配合安全启动,效果还不错。不过要注意,TrustZone 的安全世界也需要代码审计——我见过有人把漏洞写进 Secure World,那就白搭了。

曾经踩过的坑:TrustZone 的安全世界和正常世界共享同一块 DRAM。如果硬件没有做内存隔离,侧信道攻击可以跨世界读取数据。选 SoC 时一定要确认硬件支持 TZASC(TrustZone Address Space Controller)。

PCR 寄存器与度量日志

PCR 是 TPM 的灵魂。每个 PCR 寄存器存储一个 256 位(SHA-256)或 160 位(SHA-1)的哈希值。

度量过程是这样的:

  1. 系统启动时,每个组件(BIOS、Bootloader、OS 内核)被度量。
  2. 度量值通过 TPM2_PCR_Extend 操作写入 PCR。
  3. Extend 操作是:PCR_new = SHA256(PCR_old || 度量值)。
  4. 最终 PCR 值反映了整个启动链的完整性。

为什么用 Extend 而不是直接覆盖?因为这样可以记录历史。你无法回退 PCR 值,除非重启。

度量日志(Measurement Log)是 PCR 的“说明书”。它记录了每次 Extend 操作的具体内容:谁度量的、度量了什么、度量值是多少。PCR 只存最终哈希,日志存全过程。

远程证明时,验证方会做两件事:

  • 拿到 PCR 值和度量日志。
  • 重新计算一遍日志,看结果是否等于 PCR 值。

如果对得上,说明度量过程没有被篡改。

PCR 索引分配(PC 客户端规范)

PCR 索引 度量内容 常见用途
0 BIOS/固件代码 验证固件完整性
1 主板配置 检测硬件变更
2 Option ROM 代码 验证扩展卡固件
3 Option ROM 配置 检测扩展卡配置变更
4 MBR/引导加载程序 验证 Bootloader 完整性
5 引导加载程序配置 检测引导参数变更
6 状态转换/唤醒 检测休眠恢复完整性
7 安全策略 验证 Secure Boot 策略
8-15 操作系统组件 由 OS 定义使用

个人经验:度量日志的格式因厂商而异。TPM 2.0 规范定义了 TCG 日志格式,但很多 BIOS 厂商有自己的扩展。解析日志时,别假设字段偏移是固定的——先读日志头部,再动态解析。

核心逻辑关系图

下面这张图展示了 TPM 度量、PCR 存储、度量日志和远程证明之间的关系。我建议你把它存下来,后面章节会反复用到这些概念。

TPM 度量与远程证明核心流程 TPM 度量与远程证明核心流程 启动组件 度量过程 PCR 寄存器 度量日志 远程证明请求 TPM 签名 验证方 PCR 值 + 日志 说明: 验证方收到 PCR 值和度量日志后,重新计算日志哈希,与 PCR 值比对。 如果一致,说明度量过程未被篡改;再验证 TPM 签名,确认数据来自真实 TPM。

曾经踩过的坑:有一次远程证明总是失败,查了两天发现是度量日志的时间戳格式不统一。BIOS 用 UTC,OS 用本地时间,验证方解析时对不上。后来我强制要求所有日志字段用 TCG 规范定义的标准格式,问题才解决。

嗯,这一章的内容就到这里。TPM 2.0 的 PCR 和度量日志是远程证明的“信任锚点”,TEE 提供了另一种隔离思路。理解这些基础,后面讲 Quote 签名、证书链验证时你才不会晕。