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 中。

举个例子:

  1. 系统上电,BIOS 代码被度量,结果写入 PCR 0。
  2. BIOS 加载 Option ROM,度量结果写入 PCR 2。
  3. BIOS 加载 MBR,度量结果写入 PCR 4。
  4. MBR 加载 Boot Loader,度量结果继续扩展 PCR 4。
  5. Boot Loader 加载 OS 内核,度量结果写入 PCR 8。

你看,每个 PCR 对应一个信任层级。如果某个层级的代码被篡改,对应的 PCR 值就会和预期值不同。远程证明时,验证方只需要检查这些 PCR 值,就能判断平台是否可信。

我建议:在实际项目中,你最好把 PCR 0-7 的预期值固化在平台的「参考值」中。这样每次启动时,你可以自动比对当前 PCR 值和参考值,一旦发现不一致,立刻告警。我在一个金融项目中就是这么做的,效果很好。

知识体系总览

下面这张图,把 PCR 的核心概念、物理特性和编号用途串在了一起。你可以把它当作本章的知识地图。

PCR 知识体系总览 PCR 平台配置寄存器 定义:TPM 内部度量值存储单元 物理特性 编号与用途 存储代码/配置的哈希摘要 20 字节(SHA-1)或 32 字节(SHA-256) 不可逆:单向哈希扩展 复位:TPM 复位或系统重启时清零 PCR 0-7:固件/引导层 PCR 8-15:操作系统层 PCR 16-23:调试/测试 核心要点 • PCR 是可信链的「记录仪」,每个 PCR 对应一个信任层级 • 不可逆特性保证了度量记录的完整性,无法伪造历史 • 编号用途标准化,不同 PCR 记录不同组件的度量值

小结

这一节的内容,说白了就是三件事:

  • PCR 是什么——TPM 内部的度量值存储单元,记录平台软件状态。
  • 两个物理特性——不可逆(单向扩展)和复位(特定条件下清零)。
  • 编号与用途——每个 PCR 有固定编号和对应的度量对象,从固件到 OS 逐层覆盖。

嗯,这些基础概念看起来简单,但它们是整个可信计算体系的根基。我见过不少开发者在做远程证明时,PCR 值对不上,最后发现是没搞清楚 PCR 的复位行为。所以,别小看这些基础。