3、硬件信任根(RoT):eFuse与OTP原理、芯片唯一密钥、信任根存储策略
安全启动的根基在哪?不在软件,不在操作系统,而在芯片硬件里的一块“不可篡改”的区域。这就是我们今天要聊的硬件信任根(Root of Trust, RoT)。
说白了,信任根就是整个安全体系的“第一块积木”。如果这块积木是假的,上面搭的一切都是空中楼阁。我见过不少团队,软件层做得固若金汤,结果密钥被从Flash里读出来,整个安全体系瞬间崩塌。嗯,硬件信任根就是用来解决这个问题的。
3.1 eFuse与OTP:一次编程,终身锁定
先讲存储介质。信任根需要“只写一次,不可更改”的存储。常见的方案有两种:eFuse和OTP(One-Time Programmable)。
3.1.1 eFuse的工作原理
eFuse,名字很形象——电子保险丝。芯片内部有一根极细的金属丝,出厂时是导通的(逻辑0)。当你给它通一个大电流,金属丝熔断,变成开路(逻辑1)。
熔断是不可逆的。一旦烧断,再也接不回去。这就是“一次编程”的物理基础。
核心特性:
- 不可逆性:熔断后无法恢复,物理上杜绝篡改。
- 位粒度编程:可以逐位烧写,不需要整块擦除。
- 可靠性问题:熔断不完全或过熔断可能导致位翻转。我在项目中遇到过eFuse读回值偶尔跳变的情况,后来加了ECC校验才解决。
3.1.2 OTP存储器的变种
除了eFuse,还有基于反熔丝(Anti-fuse)的OTP。反熔丝正好相反:出厂时是开路,编程时击穿氧化层变成导通。两者本质一样:一次编程,终身锁定。
| 特性 | eFuse | 反熔丝OTP |
|---|---|---|
| 编程原理 | 熔断金属丝 | 击穿氧化层 |
| 初始状态 | 导通(0) | 开路(1) |
| 编程电流 | 较大(mA级) | 较小(μA级) |
| 面积开销 | 较大 | 较小 |
| 常见应用 | SoC、CPU | MCU、安全芯片 |
我的建议:选型时别只看面积。eFuse虽然大,但成熟度高,读回稳定性好。反熔丝省面积,但编程电压控制要求更严。如果你做车规级产品,我倾向于eFuse + ECC的组合。
3.2 芯片唯一密钥:每颗芯片的“身份证”
信任根里存什么?最核心的就是芯片唯一密钥(Unique Device Key, UDK)。每颗芯片出厂时,在eFuse/OTP里烧录一个独一无二的密钥。这个密钥就是芯片的“生物特征”。
为什么需要唯一密钥?你想想看,如果所有芯片用同一个密钥,攻破一台设备就等于攻破整个产品线。唯一密钥把安全风险分散到每颗芯片上。
3.2.1 密钥生成方式
唯一密钥怎么来?常见三种方式:
- 真随机数生成(TRNG):芯片内部集成硬件随机数发生器,利用热噪声或振荡器抖动生成随机数。这是最安全的方式。
- 物理不可克隆函数(PUF):利用芯片制造过程中的工艺偏差生成唯一“指纹”。PUF的优点是无需存储密钥,密钥从物理特性中“提取”出来。
- 预置密钥注入:在晶圆测试或封装阶段,由安全设备写入预先生成的密钥。这种方式需要保证注入过程的安全。
注意:PUF虽然听起来很酷,但实际工程化有坑。温度、电压变化会导致PUF输出波动。我曾经在一个项目中,PUF在常温下能稳定恢复密钥,但到了-40°C,错误率飙升到15%。最后不得不加纠错码和辅助数据,才勉强通过认证。
3.2.2 密钥层级结构
单靠一个唯一密钥不够灵活。实际系统中,我们通常构建密钥层级:
- 根密钥(Root Key):存储在eFuse/OTP中,永远不离开芯片硬件。
- 设备密钥(Device Key):由根密钥派生,用于加密存储或通信。
- 会话密钥(Session Key):每次启动时临时生成,用于一次性的安全会话。
这种层级的好处是:即使会话密钥被破解,根密钥依然安全。攻击者拿不到根密钥,就无法伪造设备身份。
3.3 信任根存储策略:把鸡蛋放在最硬的篮子里
有了eFuse和唯一密钥,怎么组织存储?这里有几个关键策略。
3.3.1 存储分区规划
eFuse空间有限,通常只有几百到几千比特。必须精打细算。我一般这样规划:
| 区域 | 内容 | 大小(典型值) | 说明 |
|---|---|---|---|
| 安全配置区 | 调试接口锁定、安全等级 | 16-32 bit | 出厂后锁定,防止调试接口被恶意利用 |
| 密钥存储区 | 根密钥、公钥哈希 | 128-512 bit | 核心机密,必须加ECC保护 |
| 设备标识区 | 芯片序列号、批次号 | 64-128 bit | 用于设备身份识别 |
| 生命周期区 | 回滚计数器、状态标志 | 32-64 bit | 用于回滚保护(后面章节会细讲) |
| 冗余/ECC区 | 纠错码、冗余位 | 视算法而定 | 提高可靠性,建议至少支持单比特纠错 |
3.3.2 防物理攻击策略
eFuse虽然不可改写,但攻击者可能通过物理手段读取。比如用聚焦离子束(FIB)探针直接读取熔丝状态。怎么防?
- 主动屏蔽层:在eFuse上方覆盖金属屏蔽层,一旦被破坏,芯片自动擦除密钥。
- 密钥分散存储:不把完整密钥放在连续区域,而是分散存储,甚至用逻辑混淆。
- 读保护:eFuse读取接口只在安全启动阶段可用,启动完成后立即关闭。
避坑指南:我曾经遇到一个案例,某款芯片的eFuse读取接口在启动后没有完全关闭,攻击者通过JTAG扫描找到了读取路径,直接把根密钥dump了出来。从那以后,我要求所有项目必须在BootROM里显式关闭eFuse读取权限,并且用硬件逻辑锁定,软件无法重新打开。
3.4 信任根存储架构图
下面这张图展示了信任根在芯片中的位置和存储策略的整体架构。
3.5 信任根的生命周期管理
信任根不是烧进去就完事了。从芯片设计到量产,再到设备部署,每个阶段都有安全要求。
3.5.1 量产阶段
量产时,eFuse烧录是个高风险环节。烧录设备可能被篡改,密钥可能在传输过程中泄露。我建议:
- 在安全环境中烧录:晶圆厂或封测厂的安全区域,物理隔离。
- 加密传输密钥:烧录设备与芯片之间使用临时会话密钥加密。
- 烧录后验证:读回eFuse内容,与预期值比对,确保烧录正确。
3.5.2 部署阶段
设备部署到现场后,信任根进入“只读”模式。此时要防止:
- 调试接口攻击:JTAG/SWD必须在出厂前永久锁定。
- 电压/时钟毛刺攻击:硬件需要集成检测电路,一旦检测到异常,立即复位或擦除密钥。
- 侧信道攻击:密钥派生过程要使用恒定时间算法,防止时序分析。
我的经验:信任根设计没有“绝对安全”,只有“足够安全”。攻击成本 > 攻击收益,就是好的设计。对于消费级产品,eFuse + 读保护就够了。对于车规或金融级产品,必须上主动屏蔽层和防侧信道措施。
3.6 小结
硬件信任根是整个安全启动的基石。eFuse和OTP提供了不可篡改的存储,芯片唯一密钥让每颗设备都有自己的身份,合理的存储策略把安全风险降到最低。
记住一句话:信任根的安全,决定了整个系统的安全上限。 下一层信任链的构建,都依赖于这个物理锚点是否可靠。设计时多花一分心思在硬件信任根上,后面能省十分力气。