4、硬件信任根(RoT):OTP、eFuse、安全存储区

聊完了签名算法和哈希校验,你可能会问:“公钥放在哪才安全?”

这是个好问题。公钥如果存在Flash里,攻击者改掉它,你的签名验证就形同虚设。所以,我们需要一个硬件信任根(Root of Trust, RoT)——说白了,就是芯片出厂后就不能改的那一小块“净土”。

我个人习惯把RoT比作“芯片的出生证明”。它必须满足三个条件:

  • 不可篡改:一旦写入,连上帝都改不了。
  • 不可回读:攻击者没法通过调试接口把它读出来。
  • 不可绕过:启动流程必须强制检查它。

今天我们就来拆解三种最常见的硬件信任根实现:OTP、eFuse、安全存储区。

4.1 OTP(一次性可编程存储器)

OTP,全称One-Time Programmable。名字已经说得很直白了——只能写一次。

它的物理原理通常是反熔丝(Anti-Fuse)结构。写之前,存储单元是“断开”的;写的时候,高压击穿绝缘层,让它永久“导通”。一旦导通,就回不去了。

核心特性:

  • 写入不可逆,适合存根密钥Hash或芯片唯一ID。
  • 面积小,成本低,几乎所有的MCU都内置几KB的OTP。
  • 读取速度与普通Flash相当,不影响启动性能。

我在项目中遇到过一件事:某次量产时,产线脚本把公钥Hash写错了位置,结果整批芯片的OTP都废了。嗯,从那以后我定了个规矩——OTP写入前必须做“预烧录校验”,先读回确认再熔断。

避坑指南:

  • OTP通常按“字(Word)”或“页(Page)”烧录,不支持按位修改。
  • 写入电压往往高于正常VDD(比如1.8V核压需要3.3V烧录),电源设计要留余量。
  • 部分OTP有“写保护位”,一旦置位,整个OTP区域就锁死了。这个位要最后再写。

4.2 eFuse(电子熔丝)

eFuse是另一种一次性存储技术,但原理和OTP不同。它利用电迁移(Electromigration)效应——大电流流过硅化多晶硅(Polycide)时,把熔丝“烧断”。

你想想看,OTP是“从断到通”,eFuse是“从通到断”。方向正好相反。

对比项 OTP(反熔丝) eFuse(电子熔丝)
编程原理 高压击穿绝缘层 大电流熔断导体
初始状态 断开(0) 导通(1)
编程后状态 导通(1) 断开(0)
面积 较小 略大(需要大电流驱动管)
可靠性 高(击穿后稳定) 中等(熔丝可能再生长)
典型容量 几KB ~ 几十KB 几百bit ~ 几Kbit

eFuse在高性能SoC里用得比较多,比如Intel的CSME、NXP的i.MX系列。它的优势是可以在运行时动态熔断——比如Bootloader校验完某段代码后,熔断一个eFuse位,表示“这个版本已经验证通过”。

我的经验:

eFuse的编程电流很大(几十mA),如果芯片供电能力不足,熔断可能不彻底。我曾经遇到过“半熔断”的情况——读回来是0,但过几天又变回1了。解决方案是:编程后至少读回3次确认,并且留出200ms以上的编程窗口。

4.3 安全存储区(Secure Storage)

OTP和eFuse容量都有限,存个公钥Hash还行,但如果你想存完整的证书链、多个固件版本的公钥、或者设备私钥,那就不够用了。

这时候就需要安全存储区——它通常是芯片内部的一块专用Flash或SRAM,由硬件加密引擎和访问控制逻辑保护。

安全存储区的核心机制是:

  1. 地址防火墙:只有特定的Master ID(比如BootROM、安全DMA)才能访问。
  2. 硬件加密:数据写入时自动加密,读出时自动解密,密钥不出芯片。
  3. 防回滚:每次写入都带单调计数器,旧版本数据无法覆盖新版本。

典型应用场景:

  • 存储设备私钥(用于远程证明或TLS握手)。
  • 存储多级Boot公钥(如BootROM公钥、Bootloader1公钥、App公钥)。
  • 存储安全日志或审计记录。

我记得有一次调试一个IoT模块,发现安全存储区写入后读出来全是0xFF。查了半天,原来是加密引擎的初始化向量(IV)没有正确同步。硬件加密不是“存进去就能读出来”那么简单,你得保证加解密的上下文一致。

4.4 三种RoT的协同工作

在实际产品里,这三种技术通常是组合使用的。我画了一张图来说明它们的分工:

硬件信任根(RoT)三层架构 第1层:OTP / eFuse(不可变根) 存储:芯片唯一ID、根公钥Hash、安全启动使能位 特性:出厂烧录,不可篡改,不可回读 第2层:安全存储区(受保护存储) 存储:完整公钥、证书链、设备私钥、安全计数器 特性:硬件加密、地址防火墙、防回滚 第3层:运行时信任(BootROM / Bootloader) 行为:读取OTP根密钥 → 解密安全存储区 → 验证Bootloader签名 特性:逐级验证,信任链传递 信任链起点:OTP/eFuse → 安全存储区 → BootROM → Bootloader → 应用程序

这张图展示了典型的三层信任链:

  • 第1层(OTP/eFuse):存储最核心的根密钥Hash,这是信任的起点。一旦被攻破,整个安全体系就崩塌了。
  • 第2层(安全存储区):存储完整的密钥和证书,受硬件加密保护。即使攻击者读出了Flash内容,也解不开这层加密。
  • 第3层(运行时):BootROM或Bootloader在启动时,逐级验证下一级镜像的签名。每一级都只信任上一级传递下来的公钥。

重要提醒:

千万不要把私钥存到OTP或eFuse里!OTP只能写一次,如果私钥泄露,你连换密钥的机会都没有。私钥应该放在安全存储区,并且支持密钥轮换(Key Rotation)。根公钥Hash才适合放OTP——因为它不需要保密,只需要防篡改。

4.5 实战:如何选择RoT方案?

选型时,我一般会问自己三个问题:

问题 推荐方案 原因
芯片成本敏感,只需要防篡改? OTP + 外部Flash OTP存根密钥Hash,外部Flash存加密后的固件
需要存储多个公钥或证书链? 安全存储区(内部Flash) 容量大,支持密钥轮换和版本管理
需要动态熔断状态位? eFuse 可以在运行时逐位熔断,适合细粒度安全策略
最高安全等级(如金融、车规)? OTP + eFuse + 安全存储区 三层组合,互相备份,单点失效不影响整体

我的建议:

如果你刚开始做安全启动,先别急着上eFuse。从OTP + 安全存储区的组合入手,把信任链跑通。等产品成熟了,再考虑用eFuse做细粒度的状态控制。步子迈大了,容易扯着蛋。

好了,硬件信任根这块就聊到这儿。记住一句话:信任链的强度,取决于最弱的那一环。OTP、eFuse、安全存储区,每一环都要设计得足够硬,才能扛住攻击者的折腾。