2. TPM基础

TPM(Trusted Platform Module,可信平台模块)是嵌入在主板或作为独立芯片存在的安全协处理器,它为平台提供可信根(Root of Trust)。理解TPM 1.2与TPM 2.0的差异、内部组件、密钥层次以及PCR与NV存储机制,是后续开发度量与密钥管理功能的基础。

一、TPM 1.2 与 TPM 2.0 架构对比

TPM 1.2 规范由 TCG 于 2003 年发布,其算法固定为 SHA-1 与 RSA,密钥结构受限于单一算法体系。TPM 2.0 规范于 2014 年发布,最大的变化是引入算法敏捷性(Algorithm Agility):同一芯片可同时支持 SHA-1/SHA-256/SM3、RSA/ECC 等多种算法,并通过统一的命令接口进行调度。TPM 2.0 还引入了授权策略(Policy)、增强授权(Enhanced Authorization)和更灵活的层级结构。

对比项TPM 1.2TPM 2.0
算法支持固定 SHA-1 + RSA算法敏捷,支持 SHA-256、ECC、SM 系列
密钥层次SRK 单一根Endorsement / Storage / Platform / Null 四层
授权模型OIAP/OSAP 简单授权Policy 策略授权,支持多条件组合
NV 存储索引固定,容量小灵活索引,支持多种属性与授权
命令接口命令码分散统一 TPM2_* 命令族

二、TPM 2.0 核心组件与密钥层次

TPM 2.0 内部由随机数发生器、SHA 引擎、RSA/ECC 引擎、HMAC 引擎、PCR 寄存器、NV 存储、授权会话管理器和命令调度器组成。密钥层次是理解 TPM 的关键:

  • Endorsement Hierarchy(背书层次):根为 EK(Endorsement Key),由厂商烧录,用于证明芯片身份。
  • Storage Hierarchy(存储层次):根为 SRK(Storage Root Key),用于保护用户密钥。
  • Platform Hierarchy(平台层次):由固件控制,用于平台启动阶段。
  • Null Hierarchy(空层次):无持久化,用于临时会话。

每个层次内部又分为种子(Seed)、主密钥(Primary Key)和子密钥(Child Key)。主密钥由种子经 KDF 派生,子密钥由父密钥加密保护,形成树状结构。这种设计使得密钥不需要明文存储在外部,而是以密文 blob 形式保存,使用时由 TPM 内部解密。

密钥层次的核心思想:种子 → 主密钥 → 子密钥,每一级都由上一级加密保护,TPM 外部只保存密文 blob。

三、PCR 与 NV 存储的基本原理

PCR(Platform Configuration Register)是 TPM 内部的一组寄存器,用于记录平台启动过程中的度量值。PCR 的更新不是简单写入,而是扩展(Extend)操作:

PCR_new = Hash(PCR_old || measurement)

例如:
PCR[0] = SHA256(0x00...00 || BIOS_measurement)
PCR[0] = SHA256(PCR[0] || OptionROM_measurement)

这种单向扩展保证了度量序列不可篡改,任何一步变化都会导致最终 PCR 值不同。TPM 2.0 通常有 24 个 PCR,其中 PCR 0~15 用于启动度量,PCR 16 用于调试,PCR 17~22 用于动态信任根(DRTM)。

NV 存储(Non-Volatile Storage)是 TPM 内部的持久化空间,用于保存密钥、证书、计数器或自定义数据。每个 NV 索引具有属性:

  • TPMA_NV_PPWRITE / OWNERWRITE:控制写权限。
  • TPMA_NV_POLICY_DELETE:删除是否需要策略授权。
  • TPMA_NV_READ_STCLEAR:读一次后清除。
  • TPMA_NV_WRITEDEFINE:写一次后锁定。

NV 索引常用于存储 EK 证书、平台证书、BitLocker 恢复密钥或单调计数器。与 PCR 不同,NV 存储是持久化的,掉电不丢失。

TPM 2.0 架构与密钥层次示意 TPM 2.0 芯片内部 随机数发生器 RNG SHA / RSA / ECC 引擎 HMAC 引擎 授权会话管理 PCR 寄存器组 PCR[0] ~ PCR[23] NV 存储 索引 / 证书 / 计数器 命令调度器 TPM2_* 命令族 密钥层次结构 种子 Seed(S / E / P / N) 主密钥 Primary Key 子密钥 A 子密钥 B 用户密钥 AIK 密钥 存储密钥 PCR 扩展:PCR_new = Hash(PCR_old || measurement) NV 索引:持久化存储 EK 证书 / 恢复密钥 / 单调计数器

四、典型场景与常见误区

在 Windows BitLocker 场景中,TPM 2.0 会使用 PCR[7](Secure Boot 策略)和 PCR[11](BitLocker 访问控制)来密封恢复密钥。如果固件更新导致 PCR 值变化,BitLocker 会要求输入恢复密钥。在 Linux 上,systemd-cryptenroll 可将 LUKS 密钥绑定到 PCR[7]+PCR[11]。

开发建议:在编写 TPM 应用时,优先使用 TPM 2.0 的 Policy 授权,而不是直接使用明文口令。Policy 可以组合 PCR 值、NV 索引状态和物理存在(Physical Presence)条件。
常见误区:
1. 认为 PCR 可以随意写入——PCR 只能扩展,不能直接赋值。
2. 认为 NV 存储可以无限写入——NV 索引有写寿命限制,频繁写入会损坏芯片。
3. 混淆 EK 与 SRK——EK 用于身份证明,SRK 用于密钥保护,二者用途不同。

掌握 TPM 2.0 的层次结构、PCR 扩展机制和 NV 存储属性后,就可以进一步学习密钥创建、密封/解封、远程证明等高级功能。这些基础概念将贯穿后续所有开发章节。