3、TPM与TCM基础:TPM2.0规范、TCM与TPM的区别、PCR寄存器与度量存储

好,咱们今天聊聊可信启动的“心脏”——TPM和TCM。说实话,这两个东西我刚开始接触时也绕了不少弯路。你想想看,一个硬件安全模块,里面藏着密钥、存着度量值,一旦配错,整条信任链就断了。我当年第一次部署时,就因为PCR寄存器没搞明白,折腾了整整两天。

别急,咱们一步步来。先搞清楚TPM 2.0到底是个什么玩意儿。

3.1 TPM 2.0规范:不只是升级

TPM 1.2时代,说实话有点“死板”。它只支持SHA-1和RSA,算法固定,扩展性差。到了TPM 2.0,规范彻底重写了。我个人习惯把它看作一个“可编程的安全微控制器”。

TPM 2.0的核心变化有几点:

  • 算法灵活性:不再绑定单一算法。你可以选SHA-256、SHA-384,甚至SM3、SM4。嗯,这对国产化场景特别重要。
  • 命令集重构:从原来的“固定功能”变成了“资源管理”。你通过发送命令来操作对象,而不是调用硬编码的函数。
  • 授权机制:支持密码、HMAC、策略等多种授权方式。我项目中遇到过用策略授权实现“必须同时有管理员和用户才能解锁”的场景,非常灵活。

关键点:TPM 2.0不是TPM 1.2的简单升级,它是架构级的重构。如果你还在用1.2的思路去理解2.0,很容易掉坑里。

举个例子,TPM 2.0中有一个概念叫“持久化对象”。你可以把密钥存储在TPM内部,也可以导出加密后存到外部。我刚开始时以为所有密钥都必须锁在TPM里,结果发现有些场景下,把密钥加密后存到磁盘反而更灵活——只要保证加密密钥在TPM里就行。

3.2 TCM与TPM的区别:国产化的选择

说到TCM,很多人第一反应是“国产TPM”。其实这个说法不准确。TCM是中国制定的可信计算模块标准,它和TPM有本质区别。

我整理了一个对比表,方便你快速理解:

对比项 TPM 2.0 TCM
标准制定 TCG(国际组织) 中国国家密码管理局
核心算法 RSA、ECC、SHA系列 SM2、SM3、SM4(国密算法)
密码体系 非对称+对称+哈希 国密算法体系
命令接口 TPM2.0命令集 兼容TPM命令,但底层不同
应用场景 全球通用 中国合规场景(如等保、密评)

说白了,TCM就是“用国密算法实现的TPM”。但要注意,它们不是完全兼容的。我曾经帮客户做过一个迁移项目,原来用TPM做的度量链,换到TCM后,PCR的扩展算法从SHA-256变成了SM3,整个度量值都不一样了。嗯,这个坑我踩过。

警告:不要以为TCM和TPM可以无缝替换。PCR的度量算法不同,导致同一段代码的度量值完全不同。如果你在TCM上验证TPM的度量值,肯定失败。

3.3 PCR寄存器与度量存储:信任链的“账本”

PCR(Platform Configuration Register)是TPM/TCM内部的一组寄存器。它们的作用很简单——记录度量值。但为什么说它是信任链的核心?

你想想看,系统启动时,BIOS度量BootLoader,BootLoader度量内核,内核度量应用。每一步的度量结果都存到PCR里。如果中间任何一步被篡改,PCR的值就不对了。这就是“信任链”的物理基础。

PCR有几个关键特性:

  • 不可重置:除了平台复位,你没法清空PCR。嗯,这是为了防止攻击者伪造度量值。
  • 只能扩展:PCR的值只能通过“扩展”操作更新。扩展公式是:PCR_new = SHA256(PCR_old || 度量值)。这意味着你没法直接写一个任意值进去。
  • 不同用途:TPM 2.0定义了多个PCR索引,每个索引有特定用途。比如PCR 0用于BIOS/固件,PCR 1用于主机平台配置,PCR 2用于Option ROM代码。

我画了一张图,帮你理解PCR的扩展过程:

PCR扩展过程示意图 BIOS/固件 度量BootLoader PCR[0] BootLoader 度量内核 PCR[4] 内核 度量应用 PCR[8] 每一步度量结果都通过扩展操作写入对应的PCR索引 如果任何一步被篡改,PCR值将无法与预期值匹配

看到没?每一步都是链式的。BIOS度量完BootLoader后,把度量值扩展到PCR[0]。BootLoader再度量内核,扩展到PCR[4]。内核再度量应用,扩展到PCR[8]。这个链条一旦断了,系统就知道出问题了。

小技巧:在实际部署中,我建议你把PCR的预期值提前计算好,存到TPM的NV(非易失性)存储里。每次启动后,对比实际PCR值和预期值。如果对不上,直接拒绝启动。这叫“静默启动失败”,比报错更安全——攻击者不知道哪里出了问题。

还有一个容易忽略的点:PCR的索引分配。TPM 2.0规范里,PCR 0-15是预留给平台固件的,PCR 16-23是给操作系统用的。我见过有人把应用度量值写到PCR 0里,结果和BIOS的度量值混在一起,查问题查了半天。嗯,这个坑我帮你们踩过了。

最后说一句,PCR的扩展操作是单向的。你没法“撤销”一次扩展。这意味着如果你度量了一个错误的组件,只能重启系统。所以,度量策略一定要设计好——度量什么、什么时候度量、度量结果怎么处理,都得提前想清楚。

好了,TPM和TCM的基础就聊到这儿。记住,PCR是信任链的“账本”,TPM/TCM是“账本”的保管人。账本对了,系统才可信。

可可精品资料库