3. 安全架构设计:硬件安全模块(HSM)架构、安全启动链设计、信任根(RoT)建立
好,我们进入第三章。这一章讲的是整个安全体系的骨架——硬件安全模块、安全启动链和信任根。说白了,就是回答三个问题:谁可信?怎么证明可信?可信的根基在哪?
我做了这么多年安全,见过太多软件层面的花架子。说句实在话,如果硬件底层没扎稳,上层堆再多加密算法都是白搭。攻击者一个故障注入就能把你的信任链从根上打断。所以,这一章的内容,是后续所有安全机制的地基。
3.1 硬件安全模块(HSM)架构
HSM 不是一颗独立的芯片,而是一个隔离的安全执行环境。它通常集成在 SoC 内部,有自己的 CPU、内存、加速器和外设接口。我习惯把它理解成「芯片里的安全岛」——岛上的人(安全固件)和岛外的人(普通应用)互不干扰。
3.1.1 HSM 的核心组件
| 组件 | 功能 | 我的经验 |
|---|---|---|
| 安全 CPU | 运行安全固件,处理密钥管理、认证、加解密 | 建议选低功耗、高可靠性的内核,比如 Cortex-M 系列 |
| 安全存储器 | 存储密钥、证书、安全状态 | 必须用 OTP 或 eFuse,不能是 Flash |
| 硬件加速器 | AES、RSA、ECC、哈希等运算 | 别让安全 CPU 做纯软件加解密,性能扛不住 |
| DMA 控制器 | 安全内存与外部内存之间的数据搬运 | 注意 DMA 的访问权限隔离,否则容易出漏洞 |
| 安全定时器 | 防侧信道攻击、超时检测 | 精度要够,至少纳秒级 |
| 安全 I/O | 与外部安全元件(如 SIM、eSE)通信 | 协议要支持防重放和完整性校验 |
关键设计原则:HSM 内部的总线和外设必须与主系统完全隔离。我在一个项目中见过 HSM 和主 CPU 共享一条 AXI 总线,结果攻击者通过 DMA 读走了 HSM 的密钥。嗯,从那以后,我坚持用独立的 crossbar 或者点对点连接。
3.1.2 HSM 的典型架构
我个人比较推崇分层架构。底层是硬件隔离机制,中间层是安全服务层,顶层是应用接口。这样每一层只做一件事,出了问题也好定位。
设计小技巧:安全服务层最好做成无状态的。每个请求都独立处理,不依赖历史状态。这样即使某个请求被攻击者干扰,也不会影响后续操作。我在做车规级 HSM 时就用这个原则,故障注入测试的通过率提高了不少。
3.2 安全启动链设计
安全启动,说白了就是逐级验证。从最底层的 BootROM 开始,每一级代码在运行前都要验证上一级的签名。一旦某级验证失败,系统就拒绝启动。
你想想看,如果攻击者能替换你的启动代码,那整个系统就沦陷了。安全启动就是防止这种「狸猫换太子」的把戏。
3.2.1 安全启动的典型流程
- 阶段 0 (BootROM):芯片上电,BootROM 执行。它验证下一级 Bootloader 的签名。BootROM 是信任根的一部分,不可修改。
- 阶段 1 (Bootloader):验证通过后,Bootloader 加载并验证操作系统内核的签名。
- 阶段 2 (OS Kernel):内核验证关键系统服务的签名。
- 阶段 3 (系统服务):服务验证用户应用的签名。
- 阶段 4 (用户应用):应用启动,整个信任链建立完成。
注意:每一级验证失败后,必须进入安全恢复模式,不能只是打印一条错误日志就继续启动。我曾经见过一个设计,Bootloader 验证失败后只是置了个标志位,系统照样跑——结果攻击者利用这个漏洞加载了恶意固件。
3.2.2 安全启动的硬件支持
| 硬件特性 | 作用 | 避坑指南 |
|---|---|---|
| OTP/eFuse | 存储根公钥哈希、安全配置 | 一次性编程,烧录前要反复确认 |
| 安全 DMA | 在验证过程中搬运代码,防止 CPU 被干扰 | DMA 通道必须与主系统隔离 |
| 硬件哈希引擎 | 快速计算代码哈希值 | 支持 SHA-256 及以上,别用 MD5 |
| 硬件签名验证引擎 | 验证 RSA/ECDSA 签名 | 注意侧信道防护,别让签名密钥泄露 |
| 安全定时器 | 防止验证过程被无限拖延 | 超时时间要合理,太短影响正常启动 |
3.3 信任根(RoT)建立
信任根是整个安全体系的锚点。它必须满足三个条件:不可伪造、不可篡改、不可绕过。说白了,就是系统里唯一一个「天生可信」的东西。
3.3.1 信任根的类型
- 硬件信任根:通常是 BootROM 和 OTP 的组合。BootROM 是只读的,OTP 存储根密钥。这是最常用的方式。
- 软件信任根:依赖外部安全元件(如 TPM、eSE)来提供信任锚点。适合对成本敏感的场合。
- 混合信任根:硬件提供基础信任,软件负责扩展信任链。我比较推荐这种方式,灵活性和安全性兼顾。
我的建议:如果条件允许,尽量用硬件信任根。软件信任根容易被故障注入攻击绕过。我在一个 IoT 项目中见过,攻击者用激光照射芯片表面,直接跳过了 BootROM 的验证逻辑——这就是硬件防护不到位的后果。
3.3.2 信任根的建立过程
- 芯片制造阶段:在 OTP 中烧录根公钥的哈希值。这个哈希值就是信任根的「指纹」。
- 首次启动:BootROM 读取 OTP 中的哈希值,验证根公钥的完整性。
- 逐级验证:用根公钥验证 Bootloader 签名,Bootloader 再用自己的密钥验证下一级,以此类推。
- 运行时保护:信任根在系统运行期间持续监控关键安全状态,防止被篡改。
3.3.3 信任根的防护措施
| 攻击方式 | 防护措施 | 我的经验 |
|---|---|---|
| 物理探针 | 芯片顶层覆盖金属屏蔽层 | 屏蔽层要接地,否则反而成天线 |
| 故障注入 | 电压/频率/温度传感器,冗余计算 | 传感器阈值要留余量,别太灵敏 |
| 侧信道分析 | 加掩码、随机延时、恒定时间算法 | 硬件加速器自带防护最好 |
| JTAG/SWD 调试 | 物理熔断调试接口,或加密码认证 | 量产前一定要熔断,别留后门 |
一个实用的技巧:信任根建立后,可以生成一个平台配置寄存器(PCR)的摘要值。这个值记录了整个启动链的度量结果。后续任何安全服务都可以查询 PCR 值,确认系统是否处于可信状态。我在做 TPM 2.0 方案时就用这个机制,效果很好。
3.4 本章小结
这一章我们聊了三个核心概念:HSM 是安全功能的执行者,安全启动链是信任的传递者,信任根是信任的源头。三者缺一不可。
我个人觉得,设计安全架构时,最忌讳的就是「为了安全而安全」。每个机制都要有明确的威胁模型和防护目标。比如,你的产品只面对软件攻击,那硬件信任根可以适当简化;但如果要防物理攻击,那屏蔽层和传感器就一个都不能少。
嗯,这一章的内容就到这里。记住一句话:信任根是底线,安全启动是过程,HSM 是保障。把这三样东西设计好,你的系统就成功了一半。