第二章:硬件信任根(Root of Trust)
好,咱们正式开始聊硬件信任根。说实话,这是整个安全启动体系里最底层的基石。你想想看,如果最底层的东西都不安全,上面盖再高的楼也没用。
我经常跟团队里的小伙伴说:信任根,就是整个系统信任链的起点。它必须是物理上不可篡改的,否则一切免谈。
2.1 SoC内置的Boot ROM
Boot ROM,说白了就是芯片出厂时固化在硅片里的一段只读代码。这段代码在芯片制造阶段就写死了,之后谁也没法改——包括你自己。
我个人习惯把Boot ROM称为“第一口奶”。芯片上电后,CPU执行的第一条指令就来自这里。它负责做三件事:
- 初始化硬件:把时钟、内存控制器这些基本外设先跑起来
- 验证下一级镜像:检查Bootloader的签名是否合法
- 跳转执行:验证通过后,把控制权交给Bootloader
我在项目中遇到过一件事:有个客户自己改了Bootloader,结果芯片死活起不来。查了半天,发现是Boot ROM里硬编码了公钥哈希,而客户用的密钥对不匹配。嗯,这就是信任根在起作用——它只认它该认的东西。
关键点:Boot ROM的代码必须经过严格的审计和验证。一旦芯片量产,任何Bug都无法通过软件修复。只能重新流片,那成本可就大了去了。
2.2 一次性可编程存储器(OTP/eFuse)
OTP,全称是One-Time Programmable。eFuse是其中一种实现方式。你可以把它理解成芯片里的“一次性打火机”——只能烧一次,烧完就回不去了。
为什么需要这东西?因为Boot ROM是只读的,它里面不能存太多动态数据。比如设备的唯一序列号、根密钥的哈希值、芯片的配置选项——这些都得放在OTP里。
我举个例子你就明白了:
// OTP中存储的内容示例
- 芯片唯一ID:0xA1B2C3D4E5F6...
- 根公钥哈希:SHA256(public_key)
- 调试接口开关:0x00(关闭)
- 安全等级配置:0x03(最高级)
OTP的编程过程是不可逆的。我曾经见过一个工程师,在调试阶段不小心把调试接口的eFuse烧断了,结果芯片再也无法通过JTAG调试。那表情,我到现在都记得。
警告:OTP资源非常有限,通常只有几Kb甚至几百字节。规划时要精打细算,把最重要的信息放进去。别什么都往里塞,烧完了可没后悔药吃。
2.3 硬件唯一密钥的生成与存储
每个芯片都应该有自己的“身份证”——也就是硬件唯一密钥。这个密钥不能是软件生成的,必须由硬件电路直接产生。
常见的做法是利用物理不可克隆函数(PUF)。PUF利用芯片制造过程中的工艺偏差来生成唯一标识。说白了,就是每个芯片的晶体管都有微小的差异,这些差异可以被测量并转换成密钥。
我参与过一个项目,用的是SRAM PUF。原理很简单:SRAM上电时,每个存储单元的初始值是不确定的,但这个不确定性的分布是唯一的。通过读取这些初始值,就能生成一个128位或256位的密钥。
生成后的密钥怎么存?
- 直接存储在OTP里:简单粗暴,但容易被物理攻击读取
- 存储在安全寄存器中:只有特定的安全模块能访问
- 不存储,每次重建:PUF的密钥每次上电都重新生成,用完就消失
我个人比较推荐第三种方式。为什么呢?因为密钥不在内存里停留,攻击者就算拿到芯片,也没法通过冷启动攻击或者探针攻击来提取密钥。
小技巧:如果你用的是PUF方案,记得做纠错处理。因为PUF的输出会有一定的噪声,直接当密钥用可能会出错。加一个纠错码(ECC)模块,能有效提高稳定性。
2.4 信任链的建立过程
好了,现在我们把前面三个东西串起来,看看完整的信任链是怎么建立的:
- 上电复位:CPU从Boot ROM开始执行
- 读取OTP:Boot ROM读取OTP中存储的根公钥哈希
- 验证Bootloader:用根公钥验证Bootloader的签名
- 传递信任:Bootloader验证通过后,再验证下一级镜像(比如OS内核)
- 逐级验证:每一级都验证下一级的签名,直到整个系统启动完成
这个过程就像接力赛,每一棒都要确认下一棒的身份。而第一棒——Boot ROM和OTP——就是整个信任链的起点。
我记得有一次调试一个安全启动失败的问题,发现是OTP里存储的根公钥哈希被写错了。就一个字节的差异,整个系统就启动不了。所以说,信任根的正确性,直接决定了整个系统的安全性。
2.5 常见问题与避坑指南
做硬件信任根设计时,有几个坑我踩过,分享给你:
- OTP空间不够:规划阶段就要算好需要存储哪些数据,留出余量
- PUF稳定性差:温度变化会影响PUF输出,一定要做纠错和温度补偿
- 调试接口没关:量产前记得把JTAG/SWD的eFuse烧断,否则攻击者可以通过调试接口绕过信任根
- 密钥备份问题:硬件唯一密钥一旦丢失,芯片就废了。建议在安全环境中保留一份备份
总结一下:硬件信任根不是某个单一组件,而是一个由Boot ROM、OTP、硬件密钥生成模块共同构成的体系。它们相互配合,为整个系统提供了不可篡改的信任基础。做安全启动,先把这层打牢,后面的工作才能站得住脚。