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。流程如下:
- 远程验证方发送一个随机数(nonce)给设备。
- 设备 TPM 用 AIK 对当前 PCR 值 + nonce 签名。
- 设备把签名结果和 PCR 值一起发给验证方。
- 验证方用 AIK 公钥验签,确认 PCR 值未被篡改。
- 验证方比对 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 是整个信任链的锚点。它度量了从 BIOS 到应用的每一个环节,把度量值安全地存储在 PCR 中,最后通过 Quote 命令向远程验证方证明自己的状态。只要 TPM 本身是可信的,整个信任链就是可信的。