PCR 基础概念:PCR 是什么、物理特性与编号用途
好,咱们正式开始聊 PCR。很多刚接触可信计算的同学,一上来就被 PCR、度量、扩展这些术语搞懵了。我当年也一样,第一次看 TPM 规范时,满脑子都是「这寄存器到底存了个啥?」
今天这一节,我就带你把这些基础概念彻底理清。说白了,PCR 是整个可信度量体系的基石。你搞懂了 PCR,后面那些复杂的信任链、远程证明,理解起来就顺了。
PCR 到底是什么?
PCR 的全称是 Platform Configuration Register,平台配置寄存器。它不是什么神秘硬件,就是 TPM 芯片内部的一组存储单元。
但它的特殊之处在于——它存的不是普通数据,而是「度量值」。这个度量值,通常是某个代码或配置的哈希摘要。
核心定义:PCR 是 TPM 内部用于记录和存储平台软件状态(度量值)的一组专用寄存器。每个 PCR 存储一个 20 字节(SHA-1)或 32 字节(SHA-256)的哈希值。
你可以把 PCR 想象成一个「黑盒子记录仪」。系统启动时,每个关键组件(BIOS、Boot Loader、OS 内核)在运行前,都会被度量,度量结果被记录到 PCR 里。之后任何组件想篡改这个记录?没门。
PCR 的物理特性
PCR 有两个非常关键的物理特性,我建议你死记硬背也要记住。因为在实际项目中,这两个特性决定了整个可信链的设计逻辑。
特性一:不可逆(One-Way Extension)
PCR 的值不是直接写入的,而是通过 PCR_Extend 操作来更新的。这个操作是单向的,不可逆的。
具体算法是这样的:
PCR_new = SHA( PCR_old || 度量值 )
新值 = 对「旧值 + 新度量值」做一次哈希。这意味着什么?
- 你无法从新值反推出旧值——哈希的单向性保证了这一点。
- 你无法预测下一次扩展后的值——除非你知道所有历史度量值。
- 度量顺序至关重要——同样的组件,不同的加载顺序,最终 PCR 值完全不同。
我的经验:我在一个项目中遇到过一个问题:两个 BIOS 版本,功能完全一样,但 PCR 值就是不对。查了半天,发现是 BIOS 里某个驱动加载顺序变了。你看,顺序一改,PCR 值就变了。这就是不可逆特性的实际影响。
特性二:复位(Reset)
PCR 的值在特定条件下会被复位到初始值。这个初始值通常是全 0 或全 1,具体取决于 TPM 规范和平台实现。
复位发生在以下场景:
- TPM 复位或上电——所有 PCR 回到初始状态。
- 系统重启——大部分 PCR 会被复位。
- 特定平台事件——比如从 S3(挂起到内存)恢复时,部分 PCR 可能保持,部分复位。
注意:不是所有 PCR 都会在重启时复位。有些 PCR(比如 PCR 1、PCR 2)在平台复位后仍然保留之前的值,直到 TPM 本身被复位。这个细节在远程证明时特别容易踩坑。我曾经因为没搞清楚这个,导致证明报告一直对不上,排查了整整两天。
PCR 编号与用途
TPM 规范定义了多个 PCR,每个 PCR 有固定的编号和用途。这个分配是标准化的,所有 TPM 实现都必须遵守。
下面是 TPM 2.0 规范中 PCR 的典型分配表:
| PCR 编号 | 用途 | 度量内容 |
|---|---|---|
| PCR 0 | BIOS / 固件 | BIOS 代码、BIOS 配置、Host Platform Extensions |
| PCR 1 | 主机平台配置 | 主板配置、芯片组配置 |
| PCR 2 | Option ROM 代码 | 设备固件、Option ROM |
| PCR 3 | Option ROM 配置 | Option ROM 配置和数据 |
| PCR 4 | MBR / 引导加载器 | MBR 代码、引导加载器第一阶段 |
| PCR 5 | MBR / 引导加载器配置 | 引导加载器配置、GPT 表 |
| PCR 6 | 状态转换和唤醒事件 | 平台状态转换、唤醒事件 |
| PCR 7 | 安全启动策略 | 安全启动策略、证书数据库 |
| PCR 8-15 | 操作系统使用 | OS 内核、驱动、关键配置 |
| PCR 16-23 | 调试和测试 | 调试工具、测试代码 |
这个分配不是随便定的。它反映了可信链的构建顺序:从最底层的固件开始,逐级向上,每一级度量并记录到对应的 PCR 中。
举个例子:
- 系统上电,BIOS 代码被度量,结果写入 PCR 0。
- BIOS 加载 Option ROM,度量结果写入 PCR 2。
- BIOS 加载 MBR,度量结果写入 PCR 4。
- MBR 加载 Boot Loader,度量结果继续扩展 PCR 4。
- Boot Loader 加载 OS 内核,度量结果写入 PCR 8。
你看,每个 PCR 对应一个信任层级。如果某个层级的代码被篡改,对应的 PCR 值就会和预期值不同。远程证明时,验证方只需要检查这些 PCR 值,就能判断平台是否可信。
我建议:在实际项目中,你最好把 PCR 0-7 的预期值固化在平台的「参考值」中。这样每次启动时,你可以自动比对当前 PCR 值和参考值,一旦发现不一致,立刻告警。我在一个金融项目中就是这么做的,效果很好。
知识体系总览
下面这张图,把 PCR 的核心概念、物理特性和编号用途串在了一起。你可以把它当作本章的知识地图。
小结
这一节的内容,说白了就是三件事:
- PCR 是什么——TPM 内部的度量值存储单元,记录平台软件状态。
- 两个物理特性——不可逆(单向扩展)和复位(特定条件下清零)。
- 编号与用途——每个 PCR 有固定编号和对应的度量对象,从固件到 OS 逐层覆盖。
嗯,这些基础概念看起来简单,但它们是整个可信计算体系的根基。我见过不少开发者在做远程证明时,PCR 值对不上,最后发现是没搞清楚 PCR 的复位行为。所以,别小看这些基础。