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)的哈希值。
度量过程是这样的:
- 系统启动时,每个组件(BIOS、Bootloader、OS 内核)被度量。
- 度量值通过 TPM2_PCR_Extend 操作写入 PCR。
- Extend 操作是:
PCR_new = SHA256(PCR_old || 度量值)。 - 最终 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 存储、度量日志和远程证明之间的关系。我建议你把它存下来,后面章节会反复用到这些概念。
曾经踩过的坑:有一次远程证明总是失败,查了两天发现是度量日志的时间戳格式不统一。BIOS 用 UTC,OS 用本地时间,验证方解析时对不上。后来我强制要求所有日志字段用 TCG 规范定义的标准格式,问题才解决。
嗯,这一章的内容就到这里。TPM 2.0 的 PCR 和度量日志是远程证明的“信任锚点”,TEE 提供了另一种隔离思路。理解这些基础,后面讲 Quote 签名、证书链验证时你才不会晕。