4. AURIX HSM 密钥存储介质与保护机制
在 AURIX HSM 的密钥灌装与生命周期工程中,密钥“放在哪里”和“被什么保护”决定了整个安全方案的上限。HSM 内部并不是一块普通的 Flash,而是由多种物理介质、访问权限和硬件保护逻辑共同构成的存储体系。理解这些介质的差异,是正确规划密钥槽、配置访问权限、设计防回滚策略的前提。
一、HSM 内部可用的存储介质
AURIX HSM 内部主要涉及四类存储资源,它们在可写性、可擦除性、访问主体和典型用途上差异明显:
- HSM 内部 NVM(HSM NVM):HSM 内核可直接读写的非易失存储,通常用于存放 HSM 固件、配置数据、密钥槽元数据和需要持久化的运行状态。它由 HSM 侧管理,Host(主核)一般不能直接访问,只能通过 HSM 提供的服务接口间接操作。
- OTP(One-Time Programmable):一次性可编程区域,写入后不可擦除、不可修改。典型用途是存放设备唯一标识、生命周期状态位、密钥派生种子、防回滚计数器初值以及不可逆的配置锁定位。OTP 是“写一次、定终身”的介质,任何写入都必须经过严格评审。
- DFlash(Data Flash):面向数据存储的 Flash 区域,可擦写、可反复更新,容量相对较大。在 HSM 场景中,DFlash 常用于存放需要频繁更新的数据、日志、证书链或非敏感配置。由于可擦写,它不能单独承担高安全等级密钥的长期保护,必须配合加密和完整性校验。
- 密钥槽(Key Slot):这是逻辑概念而非独立物理介质。密钥槽是 HSM 内部对密钥进行编址、分类和权限绑定的管理单元,每个槽位对应一段受保护的存储空间和一组访问属性。密钥槽可以落在 HSM NVM 或 OTP 中,具体取决于密钥用途和安全等级。
二、密钥槽的属性与访问权限
密钥槽不是简单的“编号—密钥”映射,每个槽位通常绑定以下属性:
- 用途(Usage):标明该密钥用于 AES 加解密、CMAC 认证、ECDSA 签名、密钥派生还是安全启动校验。用途决定了 HSM 固件在调用该槽位时允许执行的操作。
- 访问主体(Access Subject):区分 Host 可访问、HSM 专用、或两者按条件访问。Host 可访问的密钥通常用于与主核交互的会话密钥;HSM 专用密钥则完全不出 HSM 边界。
- 读写权限(Read/Write Permission):控制密钥是否可被读出、是否可被更新、是否可被删除。高安全等级密钥通常设置为“不可读、仅可用”,即 Host 只能请求 HSM 使用该密钥完成运算,而无法获取密钥明文。
- 读保护(Read Protection):防止密钥明文通过调试接口、内存转储或侧信道被读出。读保护一旦启用,通常与生命周期状态绑定,在量产阶段不可回退。
- 防回滚(Anti-Rollback):通过单调递增计数器或版本号,阻止攻击者将固件或密钥配置回退到存在已知漏洞的旧版本。
三、保护机制如何协同工作
这些介质和属性并不是孤立存在的,它们通过 HSM 固件的访问控制逻辑形成一条完整的保护链。下图展示了从 Host 请求到密钥实际使用过程中,各存储介质与保护机制的协同关系:
从图中可以看到,Host 发出的密钥服务请求首先进入 HSM 内核,由固件根据访问权限控制模块查询目标密钥槽的属性。如果权限校验通过,HSM 才会从对应的物理介质(HSM NVM 或 OTP)中取出密钥材料,在 HSM 内部完成运算,并将结果返回给 Host。密钥明文始终不跨越 HSM 边界。
四、读保护与防回滚的工程实现要点
读保护的核心目标是让密钥“可用不可见”。在 AURIX HSM 中,读保护通常通过以下手段实现:
- 硬件访问隔离:HSM 内部存储区域对 Host 总线不可见,Host 只能通过 HSM 提供的命令接口请求运算,无法直接寻址密钥存储。
- 调试接口封锁:当生命周期进入量产或现场阶段后,JTAG/DAP 等调试接口对 HSM 区域的访问被硬件熔断或密码锁定。
- 密钥槽属性锁定:密钥槽的读保护属性一旦写入 OTP 或受保护的 NVM 配置区,后续无法通过软件修改。
防回滚机制则依赖 OTP 中的单调计数器或版本号。每次固件或密钥配置更新时,版本号递增并写入 OTP。HSM 启动时会校验当前固件版本是否大于等于 OTP 中记录的最低允许版本。如果检测到版本回退,HSM 将拒绝启动或拒绝提供密钥服务。这一机制的关键在于:计数器只能递增,不能递减,且写入操作不可逆。
工程注意:OTP 写入不可逆,任何涉及 OTP 的配置(包括防回滚计数器初值、生命周期状态位、读保护锁定位)都必须在写入前完成评审和验证。建议在开发阶段使用模拟环境或可擦写的替代方案验证流程,确认无误后再在量产阶段执行真实 OTP 写入。
五、密钥槽规划的实际示例
假设某项目需要在 AURIX HSM 中规划以下密钥:安全启动验证公钥、Host 与 HSM 之间的会话密钥、OTA 固件解密密钥、设备唯一身份密钥。一个合理的槽位分配示例如下:
| 槽位编号 | 用途 | 物理介质 | 访问主体 | 读保护 | 防回滚 |
|---|---|---|---|---|---|
| Slot 0 | 安全启动验证公钥 | OTP | HSM 专用 | 是 | 是(版本绑定) |
| Slot 1 | Host-HSM 会话密钥 | HSM NVM | Host + HSM | 是 | 否 |
| Slot 2 | OTA 固件解密密钥 | HSM NVM | HSM 专用 | 是 | 是(版本绑定) |
| Slot 3 | 设备唯一身份密钥 | OTP | HSM 专用 | 是 | 否 |
这个示例体现了几个原则:高安全等级、长期不变的密钥优先放入 OTP;需要更新或与 Host 交互的密钥放入 HSM NVM;所有密钥槽都启用读保护;与固件版本相关的密钥启用防回滚绑定。实际项目中,槽位数量和属性需要根据具体芯片型号的 HSM 规格书确认,不同 AURIX 系列在槽位数量、OTP 容量和访问控制粒度上可能存在差异。
六、常见误区与排查方向
在实际工程中,围绕存储介质和保护机制容易出现以下问题:
- 把 DFlash 当作密钥安全存储:DFlash 可擦写且 Host 可能间接访问,不适合直接存放高安全等级密钥明文。如果必须使用,应先加密再写入,并将解密密钥放入 HSM 专用槽位。
- 忽略 OTP 写入的不可逆性:在未确认配置正确前就写入 OTP,可能导致设备无法进入量产状态或密钥无法更新。建议先在小批量样品上验证完整流程。
- 防回滚计数器未预留余量:如果 OTP 中只预留了很少的版本递增空间,后续固件更新可能很快耗尽计数器。规划时应根据产品生命周期内的预期更新次数预留足够余量。
- 读保护与生命周期状态不匹配:在开发阶段启用了读保护,可能导致调试困难;在量产阶段未及时启用读保护,则可能留下密钥泄露风险。读保护策略应与生命周期状态推进同步规划。
理解 HSM 内部 NVM、OTP、DFlash 和密钥槽之间的分工,以及读保护和防回滚如何协同工作,是设计安全密钥灌装方案的基础。只有把“密钥放在哪里、谁能访问、如何防止回退”这三个问题回答清楚,后续的密钥灌装流程和生命周期管理才有可靠的落脚点。