4、硬件信任根(RoT):eFuse、OTP、TPM芯片在启动校验中的作用

聊到启动校验,有个绕不开的基石——信任根。

说白了,整个安全启动链条,总得有个「绝对可信」的起点。这个起点不能是软件,因为软件可以被篡改。它必须是硬件层面的、物理上不可篡改的东西。

这就是我们今天要聊的硬件信任根(Root of Trust, RoT)。我这些年做过的产品,但凡涉及安全启动,无一例外都要跟这三样东西打交道:eFuse、OTP、TPM芯片。

4.1 信任根到底解决什么问题?

先想一个问题:BootROM 里的代码,谁来验证它的完整性?

答案是:没人验证。BootROM 本身就是信任的起点。

但 BootROM 是掩膜在芯片内部的只读代码,出厂后无法修改。它只能做一件事——去验证下一级代码(比如 Bootloader)的签名。那验证签名需要的公钥哈希,存在哪里?

嗯,这就是硬件信任根要干的事:提供一个不可篡改的存储介质,存放公钥指纹、芯片身份、安全配置等关键信息。

核心观点:信任根不是「验证」出来的,而是「物理保证」出来的。只要根不被污染,整条链就安全。

4.2 eFuse:一次性可编程的「熔丝」

eFuse 是我用得最多的信任根载体。它本质上是一根硅熔丝,出厂时全部导通(逻辑 0)。通过施加超过额定值的电流,可以把熔丝熔断(逻辑 1)。

熔断后不可恢复。这就是「一次性可编程」的含义。

4.2.1 eFuse 存什么?

  • 公钥哈希(Key Hash):BootROM 用这个哈希去验证 Bootloader 签名的公钥是否可信。
  • 安全启动使能位:熔断后强制开启安全启动,无法关闭。
  • 芯片唯一 ID:用于设备身份认证。
  • 调试接口锁定:熔断后 JTAG/SWD 接口永久关闭,防止调试器攻击。

我的经验:我在一个 IoT 项目里吃过亏——eFuse 的编程电压没控制好,导致熔断不完全,芯片启动时公钥哈希读出来是错的。后来我强制要求:eFuse 编程后必须回读校验三次,任何一次不一致就报废。

4.2.2 eFuse 的局限性

特性 说明
容量小 通常只有几百到几千比特,存不了大密钥
一次性 写错就废,无法擦除重写
物理可探测 高端攻击者可以用 SEM(扫描电子显微镜)读取熔丝状态

4.3 OTP:更灵活的「一次性可编程存储器」

OTP(One-Time Programmable)跟 eFuse 理念类似,但实现方式不同。OTP 通常使用反熔丝技术——编程时在栅氧化层上击穿一个导电通道。

我个人觉得,OTP 比 eFuse 更适合存「少量但关键」的数据。为什么?因为 OTP 的读取功耗更低,而且可以按位编程,不需要一次性写完。

4.3.1 OTP 的典型分区

OTP Memory Map (64-bit example):
+----------------------------+
| Bit 0-31:   Key Hash[31:0] |
| Bit 32-47:  Chip ID[15:0]  |
| Bit 48-55:  Security Flags |
| Bit 56-63:  Reserved       |
+----------------------------+

你想想看,这种结构在量产时非常方便。先写芯片 ID,再写安全标志,最后写密钥哈希——每一步都可以独立完成。

注意:OTP 的编程次数虽然叫「一次性」,但很多芯片支持按字(word)编程。比如 64 位的 OTP,可以分 4 次每次写 16 位。但一旦某一位被写为 1,就再也变不回 0 了。

4.4 TPM 芯片:独立的安全协处理器

eFuse 和 OTP 都是芯片内部的。那如果主芯片本身就不安全呢?

这时候就需要 TPM(Trusted Platform Module)了。TPM 是一颗独立的芯片,有自己的处理器、存储器和加密引擎。它跟主芯片通过 LPC 或 SPI 总线通信。

4.4.1 TPM 的核心能力

  • 平台配置寄存器(PCR):存储启动过程中各阶段的哈希值。每次扩展(Extend)操作都会更新 PCR,无法回滚。
  • 背书密钥(EK):出厂时写入的唯一身份密钥,用于证明芯片身份。
  • 存储根密钥(SRK):用于加密其他密钥,保证密钥不在总线上明文传输。
  • 密封(Seal)功能:只有 PCR 值匹配时,才能解封数据。

实际场景:我在做一款金融 POS 机时,主芯片用的是普通 ARM Cortex-A 系列,没有硬件信任根。我们外挂了一颗 TPM 2.0 芯片。启动时,BootROM 先测量自身,把哈希扩展到 PCR[0];然后测量 Bootloader,扩展到 PCR[1];再测量内核,扩展到 PCR[2]。如果任何一个 PCR 值跟预期不符,TPM 拒绝释放磁盘加密密钥——机器直接变砖。

4.4.2 TPM vs eFuse/OTP:怎么选?

维度 eFuse / OTP TPM 芯片
成本 几乎零成本(集成在芯片内) 额外 1-3 美元
容量 小(几百比特) 大(几十 KB 非易失存储)
灵活性 一次性写入,不可更改 可多次扩展 PCR,支持动态信任链
抗物理攻击 中等(可被 SEM 读取) 高(有主动屏蔽层和传感器)
适用场景 轻量级 IoT、MCU PC、服务器、金融设备

4.5 硬件信任根在启动链中的位置

为了让你更直观地理解,我画了一张图。这张图展示了从芯片上电到操作系统加载的完整信任链,以及 eFuse/OTP 和 TPM 各自扮演的角色。

硬件信任根在启动校验中的位置 BootROM(不可修改) 读取 eFuse/OTP 中的公钥哈希 eFuse / OTP 公钥哈希 / 安全标志 Bootloader BootROM 验证签名后加载 OS Kernel Bootloader 验证签名后加载 TPM 芯片 PCR[0] = Hash(BootROM) PCR[1] = Hash(Bootloader) PCR[2] = Hash(Kernel) PCR[3] = Hash(Config) 说明: 1. eFuse/OTP 提供静态信任根——公钥哈希在出厂时熔断,不可更改。 2. TPM 提供动态信任链——每个阶段测量并扩展 PCR,形成不可伪造的启动日志。 3. 两者可以共存:eFuse 保护 BootROM 的验证公钥,TPM 记录并密封后续阶段的度量值。 4. 虚线表示 TPM 通过 SPI/LPC 总线与主芯片通信,独立于主芯片运行。

4.6 避坑指南:我踩过的三个坑

做硬件信任根设计,有些坑是教科书上不会写的。我分享三个真实经历:

  1. eFuse 编程顺序搞反了:有一次我先熔断了安全启动使能位,然后才去写公钥哈希。结果写到一半掉电了——哈希没写完,但安全启动已经强制开启。芯片直接变砖,整批 2000 片报废。后来我改了流程:先写所有数据,最后再熔断使能位。
  2. TPM PCR 扩展顺序没对齐:BootROM 和 Bootloader 对同一个组件的度量顺序不一致,导致 PCR 值对不上。排查了两天才发现是哈希扩展的输入顺序反了。我现在的习惯是:把 PCR 扩展策略写进设计文档,代码生成时自动检查一致性。
  3. OTP 读时序不满足:某款芯片的 OTP 读取需要等待 50ns 才能稳定,但 BootROM 代码在复位后立即读取,导致读到全 0。加了一个 NOP 延时就好了。嗯,这种问题仿真很难发现,必须实测。

重要提醒:硬件信任根一旦部署错误,几乎没有补救机会。eFuse 熔断了就是熔断了,OTP 写错了就是写错了。量产前务必做「破坏性测试」——故意写错数据,验证芯片是否能正确拒绝启动。

4.7 小结

硬件信任根是整个安全启动的基石。eFuse 和 OTP 适合做轻量级的静态信任根,成本低、集成度高;TPM 芯片适合做动态信任链,功能强、安全性高。

选哪种方案,取决于你的产品对成本、安全等级和灵活性的要求。我个人建议:能用 eFuse 解决的问题,不要上 TPM;但一旦涉及金融级安全,别省那颗 TPM 的钱。