TPM 基础:硬件架构、核心功能与边缘结合

聊远程证明,绕不开 TPM。说白了,TPM 就是一颗专门干「信任」这活儿的芯片。我在边缘项目里摸爬滚打这几年,见过太多人把 TPM 当成普通加密芯片用,结果远程证明环节漏洞百出。今天咱们就把 TPM 的底裤扒干净。

TPM 硬件架构:一颗专为信任而生的芯片

TPM 不是通用 CPU,它是一颗专用安全微控制器。我习惯把它拆成三个层次来看:

  • 密码引擎:硬件实现的 RSA、ECC、SHA-256、HMAC。注意,是硬件,不是软件库。这意味着密钥操作在芯片内部完成,私钥永远不会暴露给主 CPU。
  • 非易失性存储:存储密钥、证书、度量值。掉电不丢失。我见过有人把平台证书直接放文件系统里,嗯,那跟把家门钥匙挂门口没啥区别。
  • 易失性存储:运行时 PCR(平台配置寄存器)值、会话上下文。每次上电清零。

这里有个关键设计—— shielded locations(屏蔽位置)。TPM 内部的数据通路是物理隔离的,主 CPU 根本读不到 TPM 内部的密钥材料。你想想看,就算操作系统被攻破了,攻击者也拿不走 TPM 里的私钥。

核心认知:TPM 不是帮你「加密数据」的,而是帮你「证明平台状态」的。这是远程证明的根基。

TPM 核心功能:度量、存储、报告

TPM 的功能很多,但远程证明只关心三个:度量(Measure)、存储(Store)、报告(Report)。我管它叫「信任三角」。

度量(Measure)

度量不是「测量」,而是哈希扩展。过程很简单:

PCR_new = SHA-256(PCR_old || 新组件的哈希值)

为什么要用扩展而不是直接覆盖?因为这样可以记录启动顺序。BIOS 先度量 Bootloader,Bootloader 再度量内核,内核再度量应用……每一步的哈希值都叠加进 PCR。最终 PCR 值就是整个启动链的「指纹」。

我在项目中遇到过一个问题:某款边缘网关的 BIOS 没有度量 Option ROM,结果攻击者插了一块恶意网卡,TPM 完全没察觉。嗯,从那以后我要求所有固件必须度量每一个可执行组件。

存储(Store)

TPM 的存储分两类:

存储类型 用途 特点
NVRAM 存放持久化密钥、证书 掉电不丢失,有访问控制
PCR 存放度量值 上电清零,只可扩展不可重置

注意,PCR 的值不能直接读。你只能通过 TPM 的 Quote 命令获取签名后的 PCR 值。为什么?因为直接读的话,攻击者可以伪造 PCR 值。Quote 命令用 TPM 内部的 Attestation Identity Key(AIK)对 PCR 值签名,这样远程验证方才能确信这个 PCR 值是真的。

避坑指南:我曾经看到有人把 AIK 私钥导出到文件里保存。这完全违背了 TPM 的设计初衷。AIK 必须留在 TPM 内部,永远不能导出。

报告(Report)

报告就是远程证明的核心操作——Quote。流程如下:

  1. 远程验证方发送一个随机数(nonce)给设备。
  2. 设备 TPM 用 AIK 对当前 PCR 值 + nonce 签名。
  3. 设备把签名结果和 PCR 值一起发给验证方。
  4. 验证方用 AIK 公钥验签,确认 PCR 值未被篡改。
  5. 验证方比对 PCR 值与预期值,判断设备是否可信。

这里有个细节:nonce 的作用是防止重放攻击。如果没有 nonce,攻击者可以截获一次合法的 Quote 响应,然后反复使用。我见过一个 IoT 平台就是因为没加 nonce,被攻击者用重放攻击绕过了远程证明。

TPM 与边缘设备的结合

边缘设备和服务器不一样。服务器有专用 TPM 芯片,但边缘设备往往受限于成本、功耗、体积。我总结了几种常见的结合方式:

方案 实现方式 适用场景 我的评价
独立 TPM 芯片 专用安全芯片,通过 LPC/SPI 连接 工业网关、边缘服务器 最可靠,但成本高
fTPM(固件 TPM) 在 CPU 的 TrustZone/SE 中模拟 TPM ARM 架构的边缘设备 成本低,但依赖固件安全
vTPM(虚拟 TPM) 在 Hypervisor 中为虚拟机提供 TPM 功能 边缘虚拟化场景 灵活,但信任根在 Hypervisor
软件 TPM 纯软件模拟,无硬件保护 开发测试环境 千万别用于生产

我个人最推荐独立 TPM 芯片。为什么?因为信任根必须物理隔离。fTPM 虽然方便,但它的密钥材料存储在 CPU 的片上存储里,一旦 CPU 被物理攻击,密钥就保不住了。我在一个工业项目中吃过这个亏——攻击者通过电压故障注入,从 CPU 的 TrustZone 里读出了 fTPM 的密钥。

警告:如果你选择 fTPM,务必确认 CPU 厂商是否提供了针对故障注入、侧信道攻击的硬件防护。不是所有 TrustZone 实现都安全。

另外,边缘设备还有一个特殊需求——离线证明。边缘设备可能长时间断网,无法与远程验证方通信。这时候需要 TPM 支持「本地证明」:设备在本地生成一个证明令牌,等网络恢复后再提交。TPM 2.0 的 Policy 机制可以很好地支持这种场景。

一张图看懂 TPM 信任链

下面这张图展示了 TPM 在边缘设备启动过程中的信任传递关系。我习惯把它叫做「信任链的锚点」。

TPM 信任链与远程证明流程 TPM 信任链与远程证明流程 TPM 信任根(RoT) 度量链:BIOS → Bootloader → 内核 → 应用 PCR 存储度量值 Quote(AIK 签名) 远程验证方验签 关键点 私钥永不离开 TPM PCR 只可扩展不可重置

从这张图你能看到,TPM 是整个信任链的锚点。它度量了从 BIOS 到应用的每一个环节,把度量值安全地存储在 PCR 中,最后通过 Quote 命令向远程验证方证明自己的状态。只要 TPM 本身是可信的,整个信任链就是可信的。