密钥保险库 Key Vault:OTP/eFuse、密钥派生、零化与生命周期
更新时间:2026-09-19。前置:安全启动链、防故障注入/侧信道、总线防火墙/TrustZone。安全启动验签、固件解密、安全调试解锁、设备身份都依赖密钥。根密钥一旦被固件读出或从总线上看到,整个信任链崩塌。Key Vault(密钥保险库/密钥管理单元)负责密钥的安全存放与使用。
一、设计目标:密钥可用但不可见
核心原则——软件可以「使用」密钥做加解密/验签,但永远无法「读出」密钥的原始比特:
- 密钥不映射到可读寄存器/内存,不经过普通系统总线明文传输。
- 软件只传一个**密钥槽句柄(key slot ID/index)**给硬件 crypto 引擎,引擎在内部从保险库取密钥完成运算,明文密钥不出硬件边界。
- 对密钥的访问受身份(安全世界/非安全、特权级、引擎 ID、上下文)和策略(用途、是否允许解密/签名/包装)限制(配合 MPU/PMP、IOMMU 的隔离)。
二、根密钥的物理存储:eFuse / OTP
- eFuse(电熔丝)/ OTP(一次性可编程):出厂或安全 provisioning 时烧入根密钥/根公钥哈希/生命周期位;物理上不可逆(熔断),普通读接口被屏蔽,只允许硬件安全模块在内部读取。
- 有的工艺用 anti-fuse(击穿介质导通)、ROM key、外加安全元件/TPM;电池备份 RAM(battery-backed)用于需要可更新的密钥。
- 读保护:即使安全处理器也不直接得到原始 root key,而是把 eFuse 输出直接连到密钥派生/加密硬件,软件读到的是屏蔽值(全 0 或锁定标志)。
- 防探针:OTP 控制器在开盖/毛刺时配合传感器(见 tamper)清零/锁死;读取时序和扰码增加物理提取难度。
- 注意 eFuse 本身可能被侧信道(烧录电流)分析,provisioning 要安全产线环境。
三、密钥层次与派生(KDF)
不在各处复制根密钥,而是树状派生,实现密钥隔离与更新:
bash
HUK/根密钥(在 eFuse,不可读)
├─ KDF(HUK, "boot" , 设备状态) ─► 固件解密/验证密钥(每阶段/版本)
├─ KDF(HUK, "debug", 授权令牌) ─► 安全调试解锁密钥
├─ KDF(HUK, "storage", salt) ─► 外部 Flash 加密密钥(见 XIP 解密)
├─ KDF(HUK, "appA" ) ─► 应用/客户域密钥(域间隔离)
└─ KEK(Key Encryption Key) ─用于包装(wrap)其他可更新密钥- KDF(Key Derivation Function):以根密钥 + 标签/上下文(domain separation)+ salt/nonce 在硬件里算出子密钥;同一根密钥对不同用途/上下文得到不同子密钥,一个泄漏不影响其他。
- 绑定设备状态(固件版本、安全状态、生命周期)派生,实现防回滚:旧版本/不安全状态派不出能解新数据的密钥(见 安全启动防回滚)。
- 设备唯一密钥(HUK)使每台设备密钥不同,密文不能跨设备搬。
四、密钥包装(Key Wrapping)与密钥注入
- 可更新/大量的会话密钥不烧 eFuse,而是用 KEK 加密(wrap)后存放在普通 Flash/RAM;使用时引擎在内部用 KEK 解包(unwrap)到内部密钥寄存器,明文不暴露给软件。
- 外部注入密钥(如厂商给安全调试授权)经授权协议:用设备内公钥/根密钥验证授权包(带 nonce 防重放、设备 ID 绑定),通过后在硬件内解出会话密钥,用后即弃。
- 调试解锁典型流程:授权服务器用设备 challenge 签发有时效的 token → 芯片验签后临时开受限调试,窗口结束/复位即关(见 JTAG 安全、CoreSight 安全)。
五、密钥槽、策略与硬件 crypto 配合
Key Vault 通常提供若干密钥槽(key slot):
- 每槽有元数据/策略:密钥类型(AES/RSA/ECC/HMAC/曲线)、允许的用途(encrypt/decrypt/sign/verify/wrap/unwrap/derive)、允许调用的引擎和安全状态、生命周期约束。
- DMA/crypto 引擎收到「slot id + 数据」后,内部走专用安全总线取密钥;密钥寄存器不可被主机读回(读返回 0/错误)。
- 敏感中间值/掩码也在引擎内部(见 侧信道掩码)。
- 随机数:密钥/nonce 生成必须用通过健康检测(NIST SP 800-90B 类)的 TRNG/DRBG,弱随机数使密钥可预测。
六、零化(Zeroization)与复位/掉电
- 易失密钥寄存器(解包的会话密钥、派生密钥)必须在以下时刻硬件清零:会话结束、低功耗进入/退出(retention 是否保留要按策略)、检测到 tamper/glitch、安全状态切换、复位。
- 防止密钥残留在可被复位攻击/冷启动攻击读出的寄存器/存储里(cold-boot:断电后 RAM 内容短暂残留);密钥寄存器优先用主动清零/打乱。
- 支持显式「wipe/zeroize」命令(带权限),以及全局紧急清零(tamper 联动,见 POR/WDT/复位)。
- 复位域划分:密钥所在电源/复位域与普通逻辑隔离,普通软复位不应能让保险库进入不一致状态。
七、生命周期(Lifecycle)
设备有状态机控制可用功能(与 安全启动生命周期 一致):
blank/provisioning → open/development → secure/field/provisioned → locked → (return/RMA/terminated)。- open/dev:可能允许调试、看到更多信息(工厂开发用)。
- secure/locked:调试关闭/需授权、只引导验签固件、密钥策略生效。
- RMA(返修):经强授权后开有限诊断,但先永久清除用户密钥/数据再开放,保证返修不泄密。
- terminated/brick:检测到严重攻击或退役,永久禁用。
- 状态不可逆存 OTP,防降级(不能从 locked 刷回 open)。
八、常见的坑
- 密钥映射成可读寄存器:软件/调试器能直接读出根密钥,等于没有保险库。
- 密钥走上普通总线/进 RAM:明文经 AXI/SRAM 可被其他主控或逻辑分析仪看到(应内部消费)。
- 一处根密钥到处用:无 KDF/域分离,单点泄漏全盘失守。
- 派生不绑定状态/版本:旧固件能解新数据,失去防回滚。
- 复位/休眠后密钥残留:retention RAM、冷启动残留可被提取,缺少 zeroization。
- 生命周期可降级:状态可逆或未存 OTP,攻击者刷回 open。
- RMA 不清密钥就开调试:返修通道泄露用户密钥。
- 密钥槽策略缺失:低权限引擎/非安全世界也能用某 slot 做解密。
- TRNG 弱/无健康检测:密钥、nonce、掩码可预测,整套防护失效(见 侧信道)。
- 包装密钥解包到软件:unwrap 结果返回主机而非留在引擎。
- 无防重放授权:调试/注入 token 可重用,需 nonce/时效/设备绑定。
- eFuse 烧录环境不安全:产线泄露根密钥;需要安全 provisioning/HSM 流程。
相关与延伸
信任根与防回滚见 安全启动链;物理攻击应对见 故障注入/侧信道防护;调试授权见 JTAG、CoreSight;访问隔离见 总线防火墙、IOMMU。
总结
密钥保险库的第一原则是让软件只能用密钥的句柄、永远读不到密钥比特:不可读的 eFuse/OTP 存放设备唯一根密钥 HUK,硬件 KDF 以根密钥加用途标签和设备/版本状态派生出相互隔离的启动、存储、调试、各客户域子密钥(并绑定状态实现防回滚),大量可更新密钥用 KEK 包装加密后放在普通存储、使用时由 crypto 引擎在硬件内部解包到不可回读的密钥槽、按类型/用途/调用者身份策略在安全边界内消费;会话密钥在会话结束、复位、低功耗和检测到毛刺/开盖时立即零化以防冷启动残留,生命周期 provisioning→open→secure/locked→RMA/terminated 单向存于 OTP,RMA 必先清密钥再开有限调试——密钥上总线可读、根密钥无域分离复用、复位不清零和生命周期可降级,是四个让整套信任链失效的致命设计错误。