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,由硬件加密引擎和访问控制逻辑保护。
安全存储区的核心机制是:
- 地址防火墙:只有特定的Master ID(比如BootROM、安全DMA)才能访问。
- 硬件加密:数据写入时自动加密,读出时自动解密,密钥不出芯片。
- 防回滚:每次写入都带单调计数器,旧版本数据无法覆盖新版本。
典型应用场景:
- 存储设备私钥(用于远程证明或TLS握手)。
- 存储多级Boot公钥(如BootROM公钥、Bootloader1公钥、App公钥)。
- 存储安全日志或审计记录。
我记得有一次调试一个IoT模块,发现安全存储区写入后读出来全是0xFF。查了半天,原来是加密引擎的初始化向量(IV)没有正确同步。硬件加密不是“存进去就能读出来”那么简单,你得保证加解密的上下文一致。
4.4 三种RoT的协同工作
在实际产品里,这三种技术通常是组合使用的。我画了一张图来说明它们的分工:
这张图展示了典型的三层信任链:
- 第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、安全存储区,每一环都要设计得足够硬,才能扛住攻击者的折腾。