3、硬件信任根设计:基于OTP的根密钥存储、eFuse技术、安全存储区划分
大家好,我是你们的嵌入式安全讲师。今天我们来聊聊硬件信任根(Root of Trust, RoT)这个硬骨头。
说白了,整个安全启动链条的起点,就是硬件信任根。它必须是物理上不可篡改的,否则后面的一切校验都是空中楼阁。我见过不少产品,软件层做得花里胡哨,结果密钥直接明文存在Flash里,一读就破——那叫一个尴尬。
3.1 为什么需要硬件信任根?
你想想看,Bootloader要校验下一级镜像,它自己总得有个“初始信任”吧?这个初始信任不能来自软件,因为软件可以被改写。它必须来自硬件本身。
硬件信任根的核心要求就三条:
- 不可篡改:一旦写入,无法通过任何软件或物理手段修改。
- 不可读取:密钥只能被硬件安全模块使用,CPU核心无法直接读到明文。
- 唯一性:每颗芯片的根密钥都不同,或者至少是设备绑定的。
我在一个IoT网关项目里吃过亏。当时为了赶进度,把根密钥写在了外部SPI Flash里,还加了加密。结果样机被送去渗透测试,对方直接热风枪吹下Flash,用编程器读出了密文,再配合侧信道攻击还原了密钥。嗯,从那以后我再也不敢把根密钥放在任何可拆卸的存储介质里了。
3.2 OTP存储技术:一次性编程的“保险柜”
OTP(One-Time Programmable)存储器,就是一次性编程存储器。它像一张只能写一次的纸,写错了就报废。
常见的OTP实现方式有两种:
| 类型 | 原理 | 典型容量 | 适用场景 |
|---|---|---|---|
| 熔丝型(Fuse) | 通过大电流熔断金属丝,熔断为“1”,未熔断为“0” | 几百bit ~ 几Kbit | 密钥存储、芯片ID、配置锁定 |
| 反熔丝型(Anti-Fuse) | 通过高压击穿栅氧化层,形成永久导通 | 几Kbit ~ 几十Kbit | 高安全性场景、军用级芯片 |
我个人习惯在消费级产品里用熔丝型OTP,成本低,工艺成熟。但要注意,熔丝型OTP在编程时需要较大的电流,电源设计要留足余量。我遇到过一块板子,因为电源纹波太大,熔丝烧到一半就断了,整颗芯片直接报废——那批货赔了不少钱。
3.3 eFuse技术:现代芯片的“电子锁”
eFuse是IBM在2004年推出的一种熔丝技术,现在几乎成了SoC的标配。它本质上是一个MOS管,栅极连接着一条窄金属线。编程时施加电压,金属线发生电迁移,形成永久开路。
eFuse相比传统OTP有几个优势:
- 可以在封装后编程:不需要单独的编程工位,产线流程更灵活。
- 支持部分编程:可以分多次写入不同的bit,只要不重复写同一个bit就行。
- 面积小:一个eFuse单元只占几个晶体管面积,适合大规模集成。
但eFuse也有坑。它的编程电压通常比核心电压高(比如1.8V核心需要2.5V编程),如果电源管理没做好,容易烧坏IO。我建议在eFuse编程时,单独用一颗LDO供电,别跟其他电路共用。
3.4 安全存储区划分:把鸡蛋放在不同的篮子里
有了OTP/eFuse,我们还得规划怎么用。芯片内部的安全存储区通常分为几个区域,每个区域有严格的访问权限控制。
我一般这样划分:
| 区域名称 | 存储内容 | 访问权限 | 生命周期 |
|---|---|---|---|
| 根密钥区 | 设备根密钥(256bit AES / ECC私钥) | 仅硬件加密引擎可读 | 永久锁定 |
| 配置区 | 安全启动使能位、调试接口锁定位 | Bootloader只读,用户程序不可访问 | 一次性编程后锁定 |
| 设备标识区 | 芯片唯一ID、批次号、生产日期 | 所有软件可读,不可写 | 出厂预置 |
| 用户OTP区 | 自定义校准参数、许可证信息 | 用户程序可读,Bootloader可写 | 按需编程 |
这里有个容易忽略的点:调试接口锁定位。很多芯片的JTAG/SWD接口在出厂时是开放的,方便开发调试。但量产时必须通过eFuse把调试接口永久关闭,否则攻击者可以直接通过调试接口读取内存,绕过所有软件保护。
我见过一个血淋淋的案例:某智能门锁厂商,量产时忘了熔断调试接口锁。结果被安全研究员用JLink直接连上,dump出了整个Flash,包括所有用户密码和云端证书。那家公司后来花了半年时间召回产品,损失惨重。
3.5 硬件信任根的整体架构
说了这么多,我们来画一张图,把整个硬件信任根的结构串起来。
从这张图可以看出,硬件信任根不是单一组件,而是一个由OTP/eFuse、安全存储区和硬件加密引擎共同构成的体系。它们之间通过硬件总线连接,软件层完全无法绕过。
3.6 实战中的设计要点
最后,我总结几个实战中容易踩的坑,供大家参考:
- 密钥长度要留余量:现在主流是256bit AES或ECC P-256。别为了省eFuse空间用128bit,量子计算时代快来了。
- 编程电压要独立:eFuse编程时电流波动大,最好用独立的LDO供电,别跟核心电压混在一起。
- 预留备用位:eFuse的良率不是100%,建议每个密钥位预留2-3个备用位,万一写错了还能补救。
- 调试接口必须锁:量产前务必通过eFuse把JTAG/SWD接口永久关闭,这是最容易被忽视的安全漏洞。
- 做产线校验:编程完成后,一定要做全量读回校验,确保每个bit都写对了。我建议校验三次,两次通过才算合格。
- 硬件信任根是安全启动的物理锚点,必须不可篡改、不可读取、设备唯一。
- OTP/eFuse是实现根密钥存储的主流技术,各有优缺点。
- 安全存储区要按权限划分,根密钥区、配置区、标识区、用户区各司其职。
- 调试接口锁定是量产前的最后一道防线,千万别忘。