4、信任根与密钥存储:HSM与TEE的角色、密钥存储安全等级、防篡改设计
聊到密钥轮换和安全启动,有个绕不开的话题——密钥到底放在哪?
你想想看,如果密钥本身都不安全,那轮换得再勤快也没用。我见过不少项目,算法选得挺强,轮换策略也设计得挺漂亮,结果密钥就明文存在Flash里。嗯,这就像把金库钥匙挂在门口。
4.1 信任根:一切安全的起点
信任根(Root of Trust, RoT)说白了就是整个安全体系的锚点。它必须是一个绝对可信的硬件实体,所有安全决策都从这里开始。
我个人习惯把信任根分成两类:
- 静态信任根(SRoT):上电后第一个执行的代码,通常是BootROM。它不可更改,固化在芯片内部。
- 动态信任根(DRoT):在系统运行过程中,通过硬件机制动态建立的信任链。比如Intel的TXT技术。
核心原则:信任根必须满足三个条件——不可伪造、不可篡改、不可旁路。缺一个,整个安全体系就塌了。
我在项目中遇到过一件事:某款车规级MCU,BootROM里有个bug,攻击者可以通过电压毛刺让CPU跳过签名校验。这就是信任根被旁路的典型例子。后来我们不得不加了一颗外部HSM来兜底。
4.2 HSM与TEE:两种不同的安全执行环境
很多人搞不清HSM和TEE的区别。我简单说一下:
| 特性 | HSM(硬件安全模块) | TEE(可信执行环境) |
|---|---|---|
| 物理形态 | 独立芯片或协处理器 | CPU内的安全隔离区 |
| 密钥存储 | 专用安全存储,防物理攻击 | 依赖SoC安全区,防软件攻击 |
| 性能 | 专用硬件加速,适合加解密 | 共享CPU资源,性能受限 |
| 典型场景 | 车规、金融、工业控制 | 移动设备、物联网终端 |
| 防篡改能力 | 强(主动屏蔽、自毁电路) | 中(依赖SoC安全设计) |
我个人的经验是:HSM适合做密钥的“保险柜”,TEE适合做密钥的“工作台”。两者不是替代关系,而是互补关系。
实战建议:如果成本允许,尽量用独立HSM存储根密钥,用TEE运行安全应用。这样即使TEE被攻破,根密钥也不会泄露。
4.3 密钥存储安全等级
密钥存储不是“放进去就行”。我习惯把安全等级分成五级:
- L0 - 明文存储:密钥直接写在代码或配置文件中。这是最危险的做法,千万别干。
- L1 - 软件加密存储:用另一个密钥加密后存Flash。但加密密钥本身怎么保护?这是个死循环。
- L2 - 硬件隔离存储:密钥存在芯片的OTP(一次性可编程)或eFuse中。软件无法直接读取。
- L3 - 安全元件存储:密钥存在HSM或SE内部,外部总线不可见。物理攻击难度大幅提升。
- L4 - 防篡改安全存储:在L3基础上增加主动屏蔽层、光检测、温度检测、电压检测。一旦检测到攻击,立即擦除密钥。
注意:我曾经见过一个产品,宣称支持L3安全存储,结果攻击者用聚焦离子束(FIB)切开芯片,直接读出了eFuse里的密钥。所以,安全等级不是吹出来的,是打出来的。
4.4 防篡改设计:让攻击者知难而退
防篡改设计不是要把攻击者挡在外面,而是让攻击成本远高于收益。我常用的手段有这些:
- 主动屏蔽层:芯片顶层走线迷宫,一旦被切断或短路,触发自毁。
- 光检测:封装被打开时,环境光变化触发报警。
- 温度/电压检测:防止攻击者通过降频、升压等方式进行故障注入。
- 密钥生命周期管理:密钥只在需要时短暂解密,用完后立即擦除。
- 随机延迟:关键操作加入随机延迟,防止时序分析攻击。
我记得有一次做车规级项目,客户要求密钥在HSM内部生成、内部使用、内部销毁,全程不暴露在总线上。我们设计了一个密钥协商协议,每次会话都生成临时密钥,根密钥永远不出HSM。嗯,这个方案后来成了行业参考设计。
4.5 信任链与密钥存储的协同关系
下面这张图展示了信任链如何与密钥存储协同工作:
从这张图可以看出:信任根是整个链条的起点,它负责初始化HSM和TEE。HSM负责根密钥的存储和生命周期管理,TEE负责在安全环境中使用会话密钥。防篡改模块则像保安一样,时刻监控着整个系统。
关键设计原则:密钥永远不应该离开HSM。如果需要使用密钥,让HSM把运算结果返回,而不是把密钥本身返回。这是我在多个项目中总结出的铁律。
4.6 实战中的避坑指南
最后,分享几个我踩过的坑:
- 别信“硬件安全”四个字:有些芯片号称有安全存储,但实际只是把密钥放在一个特殊地址。用调试器就能读出来。一定要看芯片的安全认证等级(比如CC EAL、FIPS 140)。
- 密钥备份要谨慎:我曾经遇到客户要求做密钥备份,结果备份密钥和主密钥存在同一个HSM里。这等于没备份。正确的做法是用密钥分享(Shamir's Secret Sharing)或托管给多个HSM。
- 防篡改不是万能的:主动屏蔽层只能防物理探针,防不了侧信道攻击。密钥使用时要加掩码和随机延时。
- 别忘了密钥销毁:产品退役时,密钥必须彻底销毁。我见过一个项目,设备报废后密钥还在Flash里,被二手市场的人读了出来。
嗯,信任根和密钥存储这块,说复杂也复杂,说简单也简单。记住一句话:安全不是功能,是设计态度。你愿意花多少成本保护密钥,决定了你的产品能防住多强的攻击者。