3、硬件信任根:片上ROM、OTP/efuse、硬件唯一密钥(HUK)、安全存储区

聊到TEE安全启动,有个东西绕不开——信任根。

说白了,信任根就是整个安全体系的「第一块基石」。它必须是绝对可信的,不能被篡改,不能被绕过。我做了这么多年嵌入式安全,见过太多系统因为信任根没扎稳,最后整个安全体系崩塌的例子。

这一章,我们就来拆解硬件信任根的四个核心组件:片上ROM、OTP/efuse、硬件唯一密钥(HUK)和安全存储区。

3.1 片上ROM:不可更改的「第一行代码」

片上ROM,也叫Boot ROM。它是芯片出厂时固化在硅片上的只读存储器。

为什么它这么重要?

因为它是CPU上电后执行的第一段代码。这段代码不可更改,物理上无法被擦写。这就保证了攻击者无法通过修改启动代码来植入恶意程序。

核心要点: 片上ROM是信任链的起点。它负责验证下一级Bootloader的签名,确保后续代码都是合法的。

我在项目中遇到过一件事:某款IoT芯片,Boot ROM里有个bug,导致在某些边界条件下会跳过签名验证。嗯,那批芯片全部报废了。所以,Boot ROM的代码必须经过极其严格的验证,因为一旦流片,就再也改不了了。

3.2 OTP/efuse:一次性可编程的「身份烙印」

OTP(One-Time Programmable)和efuse,是芯片的「一次性写入」存储单元。

你可以把它理解成芯片的身份证。出厂时写入一些关键信息,比如:

  • 芯片唯一ID
  • 公钥哈希值
  • 安全配置位
  • 调试接口的使能/禁用状态

OTP一旦写入,就不能再改。这听起来有点死板,但正是这种「死板」保证了安全性。

我的习惯: 我会在OTP里存放根公钥的哈希值,而不是直接放公钥本身。这样即使OTP被物理读取,攻击者也拿不到完整的公钥。

efuse和OTP原理类似,但实现方式不同。efuse是通过熔断金属丝来存储数据,一旦熔断,不可恢复。我个人更倾向于用efuse来做安全配置位,因为它对物理攻击的抵抗性更强。

3.3 硬件唯一密钥(HUK):每颗芯片的「独门暗号」

HUK,全称Hardware Unique Key。它是每颗芯片独有的密钥,在芯片制造过程中生成并写入。

你想想看,如果所有芯片都用同一个密钥,那攻破一颗就等于攻破全部。HUK的存在,就是为了避免这种「一锅端」的风险。

HUK通常存储在OTP或efuse中,也有芯片厂商用PUF(物理不可克隆函数)来生成。PUF利用芯片制造过程中的工艺差异来生成唯一密钥,理论上更安全。

存储方式 优点 缺点
OTP/efuse 成熟、稳定、成本低 可被物理探针读取
PUF 物理不可克隆、抗探针攻击 受温度电压影响、需要纠错电路
注意: HUK绝对不能以明文形式暴露给软件。它只能被硬件安全模块(HSM)或TEE的底层驱动访问。我曾经见过一个方案,把HUK直接读出来传给上层应用……那基本等于把家门钥匙挂在门外了。

3.4 安全存储区:密钥和敏感数据的「保险柜」

安全存储区,是TEE内部的一块隔离区域。它用来存放:

  • 派生密钥(由HUK派生出来的会话密钥)
  • 数字证书
  • 用户敏感数据(如指纹模板、支付凭证)

这块区域,普通世界的操作系统(REE)是访问不到的。只有TEE里的可信应用(TA)才能读写。

安全存储区的实现方式有两种:

  1. 片上安全存储: 直接使用芯片内部的eFlash或SRAM,速度快,但容量有限。
  2. 加密文件系统: 将数据加密后存到外部Flash,容量大,但需要额外的加解密开销。

我个人更推荐混合方案:把密钥和关键配置存在片上,把用户数据用加密文件系统存到外部。这样既保证了核心数据的安全,又兼顾了容量需求。

3.5 知识体系总览

下面这张图,把硬件信任根的四个组件串起来了。你可以看到它们是如何协同工作的:

硬件信任根核心组件 片上ROM Boot ROM 不可更改 OTP/efuse 一次性写入 公钥哈希/配置 HUK 硬件唯一密钥 每颗芯片不同 安全存储区 派生密钥 / 证书 / 敏感数据 密钥派生 配置读取 验证结果 信任链起点:片上ROM → 验证Bootloader → 加载TEE OTP/efuse 提供不可篡改的配置和公钥 HUK 保证每颗芯片的密钥唯一性 安全存储区 保护运行时敏感数据

3.6 避坑指南

做硬件信任根设计,有几个坑我踩过,分享给你:

  • OTP空间规划要留余量。 我曾经只留了10%的冗余,结果后期加需求时发现不够用,只能换芯片方案。建议至少留30%的余量。
  • HUK的派生算法要标准化。 别自己发明算法,用HKDF或者NIST SP 800-108。自己造的轮子,大概率有漏洞。
  • 安全存储区要防回滚。 攻击者可能会把旧版本的加密数据写回去,利用旧版本的漏洞。加一个单调计数器可以解决这个问题。
  • 调试接口一定要在量产时关闭。 我见过太多产品,JTAG口没锁,攻击者直接通过调试接口把整个安全存储区读走了。
一个小技巧: 在OTP里留一个「安全等级」字段。开发阶段设为0,允许调试;量产时设为1,关闭所有调试接口。这样既方便开发,又保证量产安全。

好了,硬件信任根这部分就聊到这儿。这四个组件——片上ROM、OTP/efuse、HUK、安全存储区——是TEE安全启动的根基。根基扎稳了,上面的安全体系才能立得住。

可可精品资料库