3、硬件信任根:eFuse/Otp原理、芯片唯一密钥、Boot ROM不可篡改性

安全启动的根基在哪?

很多人觉得是代码签名,或者是加密算法。其实都不是。真正的根,在芯片的硬件里。我常说一句话:软件层面的安全,最终都要依赖硬件来托底。今天我们就来聊聊这个“托底”的东西——硬件信任根。

3.1 信任链的起点:为什么需要硬件根?

你想想看,如果整个安全启动过程,所有关键数据都存储在Flash里,那攻击者只要把Flash拆下来,用编程器一读,密钥就全暴露了。这还谈什么安全?

所以,我们需要一个物理上不可篡改、不可读取的存储区域。这就是硬件信任根的核心使命。它要保证三件事:

  • 密钥永远不被软件读到——只能由硬件加密引擎使用
  • 存储的内容不能被改写——一次性写入,终身锁定
  • 第一段代码必须可信——Boot ROM在芯片出厂时就固化好了

核心观点:硬件信任根不是某个单一器件,而是一整套机制。eFuse/OTP负责存储密钥和配置,芯片唯一密钥负责身份绑定,Boot ROM负责执行第一段可信代码。三者缺一不可。

3.2 eFuse与OTP:一次性可编程存储

先说说eFuse。这名字挺形象——电子保险丝。每个bit对应一根极细的金属丝,出厂时是导通的(代表0)。当你写入1时,大电流会把这根丝熔断,变成开路。一旦熔断,就再也恢复不了了。

OTP(One-Time Programmable)是更广义的说法。除了eFuse,还有反熔丝技术、电荷俘获技术等。但原理都一样:只能从0变成1,不能反向。

3.2.1 实际项目中怎么用?

我在一个IoT网关项目里,用eFuse存了三样东西:

  1. 芯片唯一ID——64位,出厂时由晶圆厂写入
  2. 根密钥哈希——256位,用于验证Bootloader签名
  3. 安全配置位——比如是否强制启用安全启动、是否禁止JTAG调试

这里有个坑。eFuse的容量通常很小,一般只有几百到几千bit。你不可能把整个公钥存进去,只能存它的哈希。我见过有人硬塞2048位的RSA公钥,结果eFuse不够用,最后只能降级成1024位。嗯,这其实挺危险的。

经验之谈:设计阶段就要算好eFuse的bit预算。我个人习惯留出20%的余量,防止后期需求变更。另外,熔断操作一定要在产线上做最后一步——先烧录固件、测试功能,确认没问题了再熔断eFuse。否则熔断后发现bug,芯片就废了。

3.2.2 eFuse的读写模型

这张图展示了eFuse在系统中的位置和访问路径:

eFuse/OTP 在安全启动中的角色 eFuse / OTP 阵列 密钥哈希 · 配置位 · 唯一ID 产线烧录设备 (一次性写入) 硬件加密引擎 (只读,不暴露) Boot ROM 读取哈希 → 验证签名 Bootloader (信任链下一级) ⚠ 关键约束 软件永远不能直接读eFuse内容 只能通过硬件引擎使用密钥 熔断后不可逆,产线需谨慎

3.3 芯片唯一密钥:每颗芯片都有自己的“指纹”

芯片唯一密钥,也叫UID或Device Unique Key。它是在晶圆制造阶段,利用物理随机过程生成的。每颗芯片的密钥都不同,理论上不存在两颗相同的芯片。

这有什么用?举个例子。假设你的产品需要和云端通信,你可以用这个唯一密钥派生出一对设备证书。即使攻击者破解了一台设备,拿到了密钥,他也只能伪造这一台。他没办法批量克隆——因为每颗芯片的密钥都不一样。

注意:唯一密钥的随机性很关键。我遇到过一批芯片,UID的低8位全是0。查了半天,发现是晶圆厂测试模式没关干净。这种“伪随机”的密钥,等于给攻击者开了后门。所以,量产前一定要做随机性测试——至少跑一遍NIST的统计检验。

3.3.1 唯一密钥的典型用途

用途 说明 安全等级
设备身份认证 用唯一密钥签名挑战值,证明自己是合法设备 高
派生存储密钥 结合用户密码,派生文件加密密钥 中
绑定固件 固件加密时混入唯一密钥,防止固件被移植到其他设备 高
日志溯源 在安全日志中嵌入UID,便于追踪异常行为 低

3.4 Boot ROM:不可篡改的第一行代码

Boot ROM是芯片上电后CPU执行的第一段代码。它被固化在芯片的只读存储器里,出厂后任何手段都无法修改。这就是“不可篡改性”的物理基础。

Boot ROM要做什么?说白了就三件事:

  1. 初始化硬件——时钟、内存、基本外设
  2. 读取eFuse中的根密钥哈希——注意,是哈希,不是密钥本身
  3. 验证下一级Bootloader的签名——签名通过才跳转执行

这里有个细节很多人会忽略:Boot ROM本身不能有bug。因为一旦芯片量产,Boot ROM就焊死在芯片里了。我见过一个案例,某款芯片的Boot ROM在读取eFuse时,没做边界检查。攻击者构造一个超长的公钥,触发了缓冲区溢出,直接跳过了签名验证。嗯,这个漏洞永远修不了——除非你换芯片。

避坑指南:我曾经评审过一个Boot ROM设计,他们把签名验证算法写成了软件实现,没调用硬件加速器。结果启动时间多了200ms,产品经理差点疯了。所以,Boot ROM里能用硬件加速的,千万别用软件硬扛。另外,记得留一个“恢复模式”的入口——比如检测到特定GPIO电平组合时,进入USB下载模式。否则Boot ROM一旦出问题,整批芯片就只能报废。

3.4.1 Boot ROM的安全启动流程

这张流程图展示了从芯片上电到Bootloader加载的完整过程:

Boot ROM 安全启动流程 芯片上电复位 Boot ROM 开始执行 读取 eFuse 根密钥哈希 加载 Bootloader 到 SRAM 验证 Bootloader 签名 通过 跳转到 Bootloader 失败 进入错误处理

3.5 三者如何协同工作?

现在我们把三个东西串起来,看看它们怎么配合:

  • Boot ROM是执行者——它负责跑流程、做验证
  • eFuse/OTP是存储者——它保管根密钥哈希和安全配置
  • 芯片唯一密钥是身份者——它让每颗芯片独一无二,防止批量克隆

举个例子。芯片上电后,Boot ROM从eFuse里读出根密钥哈希。然后它加载Flash里的Bootloader,计算其哈希,再用硬件引擎验证签名。如果签名通过,就把控制权交给Bootloader。Bootloader继续用同样的方式验证下一级固件。这样,一条信任链就从硬件根一直延伸到应用层。

关键点:这条链上的每一级,都只信任上一级。而最顶级的信任,就建立在物理不可篡改的硬件上。没有这个根,上面所有的安全措施都是空中楼阁。

3.6 常见攻击与防御

说了这么多原理,我们来看看实际中会遇到哪些攻击。我整理了一个表格:

攻击方式 目标 防御手段
物理探针读取eFuse 直接读取熔断状态 eFuse布局加密、主动屏蔽层
电压/频率毛刺 跳过签名验证 电压/频率监测电路、冗余验证
激光故障注入 篡改Boot ROM执行流 错误检测码、指令冗余
JTAG调试接口 读取内部寄存器 eFuse熔断禁用JTAG
侧信道分析 推测密钥值 掩码技术、恒定时间比较

血的教训:我曾经帮客户分析过一批被攻击的设备。攻击者用电压毛刺让Boot ROM里的循环计数器少跳了一次,结果签名验证被跳过了。修复方案是在验证循环里加了一个硬件看门狗——如果验证没在预期时间内完成,直接复位芯片。嗯,从那以后,我设计的每个安全启动方案都会加这个保护。

3.7 小结

硬件信任根是整个安全启动的基石。eFuse/OTP提供了不可逆的存储,芯片唯一密钥提供了不可克隆的身份,Boot ROM提供了不可篡改的执行环境。三者缺一不可。

设计时记住三点:eFuse的bit要精打细算,唯一密钥的随机性要验证,Boot ROM的代码要零bug。这些经验,都是我用真金白银换来的。