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的启动顺序也有讲究。通常是:

  1. ROM代码启动,验证安全世界内核的签名。
  2. 安全世界内核启动,初始化内存隔离。
  3. 安全世界再验证正常世界的内核签名。
  4. 正常世界启动。

你看,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代码到应用层,每一步怎么验、怎么防。到时候我会拿一个实际的开源项目做例子,手把手带你走一遍。