4、硬件信任根:HSM、TEE、eFuse/OTP存储原理
聊到嵌入式安全,有个概念绕不开——信任根。说白了,就是整个系统里谁最可信?谁说了算?
我经常跟团队讲一句话:没有硬件信任根,软件安全就是空中楼阁。你代码写得再漂亮,密钥存得再隐蔽,只要硬件层面被人扒光了,一切都白搭。
这一章,咱们就深入看看三个最核心的硬件信任根技术:HSM(硬件安全模块)、TEE(可信执行环境)、还有eFuse/OTP存储。它们各自扮演什么角色?怎么配合?实战中怎么选?
4.1 硬件信任根到底是什么?
先问个问题:你的系统启动时,第一段代码是谁的?
如果是Flash里的Bootloader,那攻击者只要把Flash拆下来,读走或者篡改,你的整个安全体系就崩了。所以,我们需要一个物理上不可篡改、不可绕过的起点。
这个起点,就是硬件信任根(Root of Trust, RoT)。它通常固化在芯片内部,比如ROM里的一段代码,或者一个专用的安全协处理器。它的任务很简单:验证下一级代码的签名,然后交给它执行。一级验一级,形成一条完整的信任链。
核心原则:信任根本身必须是不可变的。它要么是ROM(只读存储器),要么是经过物理熔断的一次性编程存储。
嗯,这里要注意:信任根不只是一个芯片,而是一个完整的信任模型。你光有硬件还不够,还得有配套的密钥管理、证书体系、生命周期管理。我见过不少项目,买了带HSM的芯片,结果密钥直接明文存在Flash里……那HSM等于白买。
4.2 HSM:硬件安全模块
HSM,全称Hardware Security Module。你可以把它理解成一个专门干脏活累活的加密保镖。
它通常是一个独立的芯片,或者集成在SoC内部的一个安全岛。它的核心能力包括:
- 密钥生成与存储:密钥一旦生成,永远不出HSM。你只能通过API让它帮你做加密、解密、签名、验签。
- 真随机数生成(TRNG):基于物理噪声源,不是软件伪随机。
- 安全启动加速:硬件加速签名验证,比CPU纯软件快几十倍。
- 防篡改检测:检测到电压、温度、时钟异常,直接擦除密钥。
我在项目中遇到过一件事:有个客户用了一款高端MCU,内置HSM,但启动时间要求极短。他们发现每次启动时,HSM初始化要花200ms,这受不了。后来怎么解决的?把HSM的初始化放到后台,先让主核跑起来,HSM慢慢准备。但这里有个坑——如果HSM还没准备好,主核就调用了加密API,会直接卡死。所以,一定要加一个状态查询机制。
实战建议:选型时,别只看HSM的算法支持列表。要关注它的密钥槽数量、并发操作能力、以及生命周期管理接口。有些HSM只支持10个密钥槽,你的产品如果有多级固件、多个外设,可能就不够用。
4.3 TEE:可信执行环境
TEE,Trusted Execution Environment。它和HSM不同,HSM是硬件隔离,TEE是软件隔离(当然底层也依赖硬件)。
TEE的思路是:在同一个CPU上,划分出两个世界——
- 正常世界(Normal World):跑你的主操作系统,比如Linux、RTOS。这里不安全,容易被攻击。
- 安全世界(Secure World):跑一个微型安全内核,专门处理敏感操作,比如密钥管理、支付、指纹比对。
两个世界通过Monitor模式切换,切换开销很小,微秒级。正常世界的代码,永远无法直接访问安全世界的内存和寄存器。
我最早接触TEE是在手机芯片上,那时候叫TrustZone。后来在IoT设备上也越来越常见。说实话,TEE比HSM灵活,因为它可以跑复杂的逻辑,比如自定义的认证协议。但代价是攻击面更大——安全世界的内核也是软件,也有漏洞。
避坑指南:我曾经见过一个团队,把整个加密算法都跑在TEE里,觉得这样就安全了。结果呢?安全世界的内存分配有漏洞,攻击者通过正常世界反复申请释放内存,把安全世界的密钥数据给“挤”出来了。所以,TEE里的代码也要做安全审计,不能因为它叫“安全世界”就掉以轻心。
另外,TEE的启动顺序也有讲究。通常是:
- ROM代码启动,验证安全世界内核的签名。
- 安全世界内核启动,初始化内存隔离。
- 安全世界再验证正常世界的内核签名。
- 正常世界启动。
你看,TEE本身也依赖一个更底层的信任根——通常是ROM里的BootROM。
4.4 eFuse/OTP:一次性编程存储
聊完HSM和TEE,咱们得说说它们的“燃料”——密钥存在哪?
Flash?不行,容易被读。RAM?掉电就没了。所以,我们需要一种一次性写入、永久保存、物理上难以读取的存储介质。这就是eFuse和OTP。
| 特性 | eFuse | OTP(One-Time Programmable) |
|---|---|---|
| 原理 | 通过大电流熔断金属丝 | 通过击穿栅氧化层改变状态 |
| 容量 | 通常较小(几百到几千bit) | 可以做到较大(几Kbit) |
| 写入方式 | 一次性,不可恢复 | 一次性,不可恢复 |
| 读取方式 | 通过专用寄存器 | 通过专用寄存器 |
| 典型用途 | 芯片ID、密钥、配置位 | 密钥、校准参数、安全配置 |
你想想看,eFuse就像芯片出厂时给你的一小块“保险丝板”。你可以在上面烧录一次信息,比如:
- 根密钥的哈希值:用于验证后续密钥是否被篡改。
- 芯片唯一ID:用于绑定设备与云端。
- 安全配置位:比如“禁止调试接口”、“强制安全启动”。
我个人习惯,在项目初期就把eFuse的位图规划好。哪些位用来存密钥,哪些位用来存配置,哪些位是预留的。因为一旦烧录,就永远改不了了。我见过一个团队,烧完才发现密钥长度算错了,少烧了8个bit,结果整个批次的产品都得报废。
关键点:eFuse/OTP存储的内容,通常不是直接当密钥用的,而是作为根密钥的种子。真正的会话密钥,由HSM或TEE根据这个种子派生出来。这样即使eFuse被物理探针读到,攻击者也拿不到最终的密钥。
4.5 三者如何协同工作?
讲到这里,你可能已经感觉到了:HSM、TEE、eFuse不是互相替代的关系,而是分层协作的关系。
我画个简单的流程给你看:
芯片上电
│
▼
ROM代码(信任根起点)
│ 从eFuse读取根密钥哈希
│ 验证HSM固件签名
▼
HSM初始化
│ 从eFuse读取密钥种子
│ 生成设备唯一密钥对
▼
TEE安全世界启动
│ HSM将部分密钥注入TEE
│ TEE验证正常世界内核签名
▼
正常世界启动
│ 通过TEE/HSM API进行安全操作
▼
正常运行
你看,eFuse是最底层,存的是不可变的信息。HSM是硬件加速器,负责密钥管理和加密运算。TEE是执行环境,负责运行安全逻辑。三者缺一不可。
我曾经在一个车规级项目里,把这三者用到了极致:eFuse存根密钥,HSM做签名验证,TEE跑OTA升级的校验逻辑。攻击者即使拿到了Flash镜像,也解不开任何一层。因为密钥根本不在Flash里,而在eFuse里,而且HSM根本不允许你读出来。
4.6 选型与实战建议
最后,给你几个我踩过坑之后的建议:
- 小资源设备(Cortex-M0/M3):没有TEE,那就用HSM+OTP。很多MCU内置了安全子系统和少量OTP,够用。
- 中高端设备(Cortex-A/R):TEE+HSM+eFuse是标配。注意TEE的厂商支持,比如OP-TEE、Trusty,选一个生态好的。
- 量产时:eFuse的烧录一定要在产线上做,而且要做烧录校验。我见过产线工人把烧录电压设错了,整批芯片的eFuse都废了。
- 密钥备份:eFuse烧了就不能改,所以根密钥一定要有离线备份。否则芯片坏了,密钥丢了,整个产品线都得停。
一句话总结:硬件信任根不是买来的,是设计出来的。选好HSM、用好TEE、规划好eFuse,你的安全启动才算真正落地。
好了,这一章的内容就到这里。下一章,咱们聊聊安全启动的完整流程,从ROM代码到应用层,每一步怎么验、怎么防。到时候我会拿一个实际的开源项目做例子,手把手带你走一遍。