3、硬件信任根:片上ROM、OTP/efuse、硬件唯一密钥(HUK)、安全存储区
聊到TEE安全启动,有个东西绕不开——信任根。
说白了,信任根就是整个安全体系的「第一块基石」。它必须是绝对可信的,不能被篡改,不能被绕过。我做了这么多年嵌入式安全,见过太多系统因为信任根没扎稳,最后整个安全体系崩塌的例子。
这一章,我们就来拆解硬件信任根的四个核心组件:片上ROM、OTP/efuse、硬件唯一密钥(HUK)和安全存储区。
3.1 片上ROM:不可更改的「第一行代码」
片上ROM,也叫Boot ROM。它是芯片出厂时固化在硅片上的只读存储器。
为什么它这么重要?
因为它是CPU上电后执行的第一段代码。这段代码不可更改,物理上无法被擦写。这就保证了攻击者无法通过修改启动代码来植入恶意程序。
我在项目中遇到过一件事:某款IoT芯片,Boot ROM里有个bug,导致在某些边界条件下会跳过签名验证。嗯,那批芯片全部报废了。所以,Boot ROM的代码必须经过极其严格的验证,因为一旦流片,就再也改不了了。
3.2 OTP/efuse:一次性可编程的「身份烙印」
OTP(One-Time Programmable)和efuse,是芯片的「一次性写入」存储单元。
你可以把它理解成芯片的身份证。出厂时写入一些关键信息,比如:
- 芯片唯一ID
- 公钥哈希值
- 安全配置位
- 调试接口的使能/禁用状态
OTP一旦写入,就不能再改。这听起来有点死板,但正是这种「死板」保证了安全性。
efuse和OTP原理类似,但实现方式不同。efuse是通过熔断金属丝来存储数据,一旦熔断,不可恢复。我个人更倾向于用efuse来做安全配置位,因为它对物理攻击的抵抗性更强。
3.3 硬件唯一密钥(HUK):每颗芯片的「独门暗号」
HUK,全称Hardware Unique Key。它是每颗芯片独有的密钥,在芯片制造过程中生成并写入。
你想想看,如果所有芯片都用同一个密钥,那攻破一颗就等于攻破全部。HUK的存在,就是为了避免这种「一锅端」的风险。
HUK通常存储在OTP或efuse中,也有芯片厂商用PUF(物理不可克隆函数)来生成。PUF利用芯片制造过程中的工艺差异来生成唯一密钥,理论上更安全。
| 存储方式 | 优点 | 缺点 |
|---|---|---|
| OTP/efuse | 成熟、稳定、成本低 | 可被物理探针读取 |
| PUF | 物理不可克隆、抗探针攻击 | 受温度电压影响、需要纠错电路 |
3.4 安全存储区:密钥和敏感数据的「保险柜」
安全存储区,是TEE内部的一块隔离区域。它用来存放:
- 派生密钥(由HUK派生出来的会话密钥)
- 数字证书
- 用户敏感数据(如指纹模板、支付凭证)
这块区域,普通世界的操作系统(REE)是访问不到的。只有TEE里的可信应用(TA)才能读写。
安全存储区的实现方式有两种:
- 片上安全存储: 直接使用芯片内部的eFlash或SRAM,速度快,但容量有限。
- 加密文件系统: 将数据加密后存到外部Flash,容量大,但需要额外的加解密开销。
我个人更推荐混合方案:把密钥和关键配置存在片上,把用户数据用加密文件系统存到外部。这样既保证了核心数据的安全,又兼顾了容量需求。
3.5 知识体系总览
下面这张图,把硬件信任根的四个组件串起来了。你可以看到它们是如何协同工作的:
3.6 避坑指南
做硬件信任根设计,有几个坑我踩过,分享给你:
- OTP空间规划要留余量。 我曾经只留了10%的冗余,结果后期加需求时发现不够用,只能换芯片方案。建议至少留30%的余量。
- HUK的派生算法要标准化。 别自己发明算法,用HKDF或者NIST SP 800-108。自己造的轮子,大概率有漏洞。
- 安全存储区要防回滚。 攻击者可能会把旧版本的加密数据写回去,利用旧版本的漏洞。加一个单调计数器可以解决这个问题。
- 调试接口一定要在量产时关闭。 我见过太多产品,JTAG口没锁,攻击者直接通过调试接口把整个安全存储区读走了。
好了,硬件信任根这部分就聊到这儿。这四个组件——片上ROM、OTP/efuse、HUK、安全存储区——是TEE安全启动的根基。根基扎稳了,上面的安全体系才能立得住。
可可精品资料库