4、TPM与硬件信任根:TPM 2.0架构、平台配置寄存器(PCR)、密钥层次结构
聊到远程证明和密钥轮换,有个东西绕不开——TPM。说白了,它就是一颗专门干脏活累活的“安全协处理器”。我最早接触TPM是在做一款金融终端的项目,当时客户要求所有密钥必须“硬件隔离”,软件层连碰都不能碰。嗯,从那以后我才真正理解,什么叫硬件信任根。
这一节,我们重点拆解TPM 2.0的架构、PCR到底怎么用,以及它的密钥层次结构。你把这些搞懂了,后面做远程证明和密钥轮换,心里就有底了。
4.1 TPM 2.0 架构概览
TPM 2.0相比1.2版本,最大的变化是“去中心化”。1.2版本把算法和命令都焊死了,2.0则允许你灵活选择算法、策略和授权方式。我个人习惯把TPM 2.0的架构分成三层来看:
- 硬件层:包含加密引擎、随机数生成器、非易失性存储(NVRAM)、以及平台配置寄存器(PCR)。这些是物理存在的。
- 固件层:实现了TPM命令接口,负责解析上层发来的指令,并调用硬件能力执行。
- 软件栈层:包括TSS(TPM Software Stack),它提供API给应用程序调用。你写代码时通常只跟这层打交道。
这里有个关键点:TPM 2.0支持三种资源类型——持久对象(如背书密钥EK)、临时对象(如会话密钥)、以及NV索引。我在项目中遇到过一个问题:有人把临时对象当持久对象用,结果TPM重启后密钥丢了,业务直接瘫痪。所以,搞清楚对象的生命周期很重要。
核心认知: TPM 2.0不是一块“黑盒”,它是一台微型计算机。它有CPU、内存、I/O,只不过这些资源全部服务于安全操作。你发给它的每条命令,它都会严格校验授权后再执行。
4.2 平台配置寄存器(PCR)
PCR是TPM里最有趣的东西,也是远程证明的基石。你可以把它想象成一组“只写不读”的哈希累加器。为什么说“只写不读”?因为PCR的值只能通过扩展(Extend)操作来改变,不能直接写入任意值。
扩展操作的公式很简单:
PCR_new = SHA256(PCR_old || new_data)
你想想看,这个设计意味着什么?只要你知道PCR的初始值和每次扩展的数据,你就能复现出最终的PCR值。反过来,如果你只看到最终的PCR值,你无法反推出中间过程。这就是“度量启动”和“远程证明”能成立的根本原因。
TPM 2.0通常有24个PCR(索引0-23),每个PCR有特定的用途:
| PCR索引 | 典型用途 | 我踩过的坑 |
|---|---|---|
| 0-7 | 固件、BIOS、Boot Loader度量 | PCR 0的值在TPM复位后才会变,别指望在运行时动态改它 |
| 8-15 | 操作系统内核、驱动、启动配置 | 我曾经误以为PCR 8只度量内核,结果发现它还包含了initramfs |
| 16 | 调试用途(通常未使用) | 别用它做安全决策,因为有些平台允许调试工具重置它 |
| 17-23 | 应用程序自定义度量 | 我习惯把关键配置文件的哈希扩展到这里,用于应用层证明 |
注意: PCR的值在TPM复位(如冷启动)后会被重置为初始值。如果你需要跨启动周期保存度量状态,必须使用NV索引来存储PCR的“预期值”,而不是依赖PCR本身持久化。
4.3 密钥层次结构
TPM 2.0的密钥管理,是我觉得最体现设计功底的部分。它把密钥分成了三个层次:
- 主密钥(Primary Key):由种子(Seed)派生,种子固化在TPM内部,不可导出。主密钥可以有很多个,每个由不同的模板和种子派生。
- 子密钥(Child Key):由主密钥保护,可以存储在TPM内部,也可以加密后导出到外部存储。子密钥可以继续派生下一级子密钥。
- 临时密钥(Ephemeral Key):只在会话期间存在,用完即销毁。常用于TLS握手或一次性签名。
这里有个概念容易混淆:背书密钥(EK)和存储根密钥(SRK)。EK是TPM出厂时预置的身份标识,相当于TPM的“身份证”。SRK则是存储层次结构的根,所有用户密钥都受它保护。我个人习惯把EK只用于远程证明,把SRK用于日常密钥管理,两者职责分开,避免交叉污染。
下面这张图展示了TPM 2.0的密钥层次结构:
你看,从种子到主密钥,再到子密钥和临时密钥,每一层都有明确的职责和生命周期。我在做密钥轮换时,通常只轮换子密钥层,主密钥和种子保持不变。这样既保证了安全性,又避免了重新初始化整个TPM的麻烦。
实战建议: 如果你需要把子密钥导出到外部存储,记得使用TPM2_EvictControl命令将其设置为“持久化”状态。否则,TPM重启后,这些子密钥会丢失。我曾经因为这个疏忽,导致一批设备的密钥全部失效,教训深刻。
4.4 小结
TPM 2.0的架构、PCR和密钥层次结构,这三者构成了硬件信任根的骨架。PCR负责“度量”和“报告”,密钥层次负责“保护”和“隔离”。你想想看,没有PCR,远程证明就失去了数据来源;没有密钥层次,密钥轮换就失去了硬件保护。两者协同,才能构建一个可信的执行环境。