4、硬件信任根(RoT):什么是硬件信任根、QNX支持的RoT方案、eFuse与OTP存储
4.1 硬件信任根到底是什么?
说实话,很多做嵌入式开发的朋友,一开始听到「信任根」这个词,都觉得挺玄乎的。我当年也一样。
简单来说,硬件信任根就是整个系统安全链的「起点」。你想想看,如果这个起点本身就不安全,那后面再怎么加密、再怎么校验,都是白搭。
举个例子。你启动一个QNX系统,从BootROM开始,到IPL,再到OS内核,最后到应用程序。这一条链上,每一级都要验证下一级的签名。那问题来了——第一级是谁来验证的?
答案就是:没人验证它。它必须是天生可信的。
这个「天生可信」的硬件模块,就是信任根。它通常固化在芯片内部,出厂后不可更改。说白了,它是整个安全体系的「祖宗」。祖宗要是坏了,后面全完蛋。
硬件信任根的核心特征:
- 不可篡改性——一旦出厂,代码和数据就不能被修改
- 不可绕过性——系统启动必须经过它,跳不过去
- 不可克隆性——每个芯片的信任根是唯一的
我在项目中遇到过一件事。有个客户,他们自己做的板子,BootROM里没烧信任根,结果被人用JTAG直接读出了Flash里的全部固件。嗯,那次之后,他们才真正理解了信任根的价值。
4.2 QNX支持的RoT方案
QNX作为一个硬实时系统,对安全启动的支持是很成熟的。我个人习惯把QNX的RoT方案分成三类:
| 方案类型 | 说明 | 适用场景 |
|---|---|---|
| 芯片内置BootROM | 芯片出厂时固化的启动代码,作为第一级信任根 | 大多数ARM、RISC-V平台 |
| 外部安全元件(SE) | 独立的加密芯片,存储密钥和执行验证 | 高安全要求的车载、工控设备 |
| TPM/TEE | 可信平台模块或可信执行环境 | 需要远程证明的场景 |
我建议你优先考虑芯片内置的BootROM方案。为什么?因为成本低、集成度高。但如果你做的是车规级产品,比如ADAS域控制器,那最好加上外部SE。我曾经见过一个案例,某Tier1只用BootROM,结果被侧信道攻击拿到了密钥——教训很深刻。
QNX的IPL(Initial Program Loader)在设计上,天然支持与BootROM配合。它会从BootROM那里拿到一个「信任接力棒」,然后继续验证下一级。这个接力棒,说白了就是签名校验的结果。
我的一个小技巧:
在QNX的IPL代码里,可以加一个调试用的GPIO翻转。如果BootROM验证通过,GPIO拉高;如果失败,拉低。这样在硬件调试时,一眼就能看出信任根是否工作正常。别问我怎么知道的——当年被这个问题坑过两个通宵。
4.3 eFuse与OTP存储
聊完信任根,咱们得说说密钥存哪儿。你想想看,如果密钥放在Flash里,别人一读就出来了,那还谈什么安全?
所以,业界普遍的做法是用eFuse或OTP来存储密钥。
4.3.1 eFuse是什么?
eFuse,全称是电子熔丝。它本质上是一根非常细的金属线。出厂时,这根线是导通的(代表0)。如果你给它通一个大电流,它就熔断了(代表1)。
熔断之后,就再也回不去了。这就是「一次性可编程」的含义。
我习惯把eFuse比作「芯片的纹身」。纹上去了,就洗不掉了。
4.3.2 OTP存储
OTP(One-Time Programmable)是更广义的说法。eFuse只是OTP的一种实现方式。其他还有反熔丝、浮栅等。
在QNX的安全启动流程中,通常会把以下几样东西烧进OTP:
- 根公钥的哈希值——用于验证BootROM签名的公钥
- 芯片唯一ID——每个芯片一个,用于绑定
- 安全配置位——比如是否启用JTAG、是否允许调试
- 回滚保护计数器——防止固件降级攻击
⚠️ 重要警告:
OTP烧录是不可逆的!我曾经见过一个工程师,在调试阶段不小心把JTAG禁用的位给烧了。结果芯片再也连不上调试器,整批板子报废。所以,量产前一定要在测试板上反复验证烧录脚本。
4.3.3 eFuse vs OTP:有什么区别?
其实,eFuse是OTP的一种。但行业内习惯这么区分:
| 特性 | eFuse | OTP(广义) |
|---|---|---|
| 编程原理 | 熔断金属线 | 多种物理机制 |
| 编程速度 | 较慢(微秒级) | 较快(纳秒级) |
| 可靠性 | 高,但可能重新生长 | 取决于工艺 |
| 面积 | 较大 | 较小 |
嗯,这里要注意一点。eFuse有个「重新生长」的问题。就是熔断之后,过几年可能又长回去了。虽然概率极低,但在车规级产品中,我建议你选择反熔丝类型的OTP,可靠性更高。
4.4 实战建议
最后,给你几个我在项目中总结出来的建议:
- 密钥不要直接存明文——存哈希值就够了。公钥本身不需要保密,但它的完整性必须保证。
- 留足OTP空间——我建议至少预留20%的OTP空间给未来升级用。别问我为什么,问就是吃过亏。
- 烧录流程要自动化——手动烧录OTP,十个有九个会出错。写个脚本,一次搞定。
- 测试板和生产板分开——测试板的OTP不要烧安全位,否则调试起来想死的心都有。
好了,这一章的内容就到这里。硬件信任根是整个安全体系的基石,eFuse和OTP就是这块基石的「水泥」。搞懂了这些,后面的安全启动流程就好理解了。