4. 安全存储与密钥管理
在 TF-M 的安全世界里,“存储”从来不是简单的读写 Flash。PSA Certified 将安全存储拆分为两个互补的服务:ITS(Internal Trusted Storage,内部可信存储)与 PS(Protected Storage,受保护存储)。前者面向小容量、高完整性、必须由可信固件直接掌控的数据,例如安全计数器、设备身份摘要、密钥元数据;后者面向容量更大、可加密、可回滚保护的资产,例如证书、配置、用户密钥。二者共同构成 PSA Secure Storage 的落地形态,而密钥管理则贯穿其中,从硬件唯一密钥(HUK)出发,经过密钥派生,最终形成具有明确生命周期的可用密钥。
一、核心原理:ITS 与 PS 的分工
ITS 通常由 TF-M 的 Internal Trusted Storage 服务实现,数据直接存放在受保护的存储区域,访问路径短,完整性由硬件或安全启动链保证。它不强调机密性,而强调“不可篡改”和“可信固件独占”。PS 则通过 Protected Storage 服务提供加密与完整性保护,通常依赖密钥派生出的存储密钥对数据进行加密,并支持回滚保护。两者在 PSA Storage API 上表现一致,但底层安全属性不同。
密钥管理方面,PSA 定义了密钥标识符(key ID)、密钥类型、算法、用途、生命周期状态等属性。密钥本身并不一定以明文形式长期存在,而是通过密钥派生函数(KDF)从根密钥生成。TF-M 中常见的根密钥是硬件唯一密钥 HUK,它由芯片在制造阶段注入或由物理不可克隆函数(PUF)生成,具有设备唯一性和不可导出性。
二、方法流程:从 HUK 到可用密钥
密钥派生不是“随便哈希一下”,而是有明确输入和标签绑定的过程。典型流程如下:
- 读取 HUK:由安全启动链在受保护环境中读取,不经过非安全世界。
- 选择 KDF:TF-M 常用 HKDF 或基于 CMAC 的 KDF,输入包括 HUK、用途标签、密钥 ID、版本号。
- 生成派生密钥:输出存储加密密钥、完整性密钥或应用密钥,并写入密钥属性。
- 密钥使用:PSA Crypto 通过 key ID 引用密钥,不暴露明文。
- 生命周期管理:密钥可处于“已生成、已激活、已停用、已销毁”等状态,销毁后不可恢复。
下面是一段典型的密钥派生与存储调用示意:
/* 从 HUK 派生存储密钥,并写入 PS */
psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
psa_set_key_type(&attr, PSA_KEY_TYPE_DERIVE);
psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_DERIVE);
psa_set_key_algorithm(&attr, PSA_ALG_HKDF(PSA_ALG_SHA_256));
psa_set_key_lifetime(&attr, PSA_KEY_LIFETIME_PERSISTENT);
psa_set_key_id(&attr, KEY_ID_STORAGE_ENC);
psa_status_t status = psa_key_derivation(&op, huk_key, PSA_ALG_HKDF(PSA_ALG_SHA_256),
salt, salt_len, info, info_len,
derived_key, sizeof(derived_key));
if (status != PSA_SUCCESS) {
/* 进入安全异常处理,禁止继续使用旧密钥 */
}
三、案例场景:设备交付中的密钥生命周期
假设一台基于 TF-M 的物联网设备在产线完成注入,出厂后经历首次启动、现场激活、远程更新和最终退役。密钥生命周期可以这样落地:
| 阶段 | 密钥状态 | 存储位置 | 关键操作 |
|---|---|---|---|
| 产线注入 | 已生成 | HUK / ITS | 写入设备唯一密钥,生成初始密钥元数据 |
| 首次启动 | 已激活 | ITS + PS | 派生存储密钥,建立安全存储上下文 |
| 现场运行 | 已激活 | PS | 使用应用密钥进行 TLS、签名、数据加密 |
| 远程更新 | 已轮换 | PS + ITS | 旧密钥停用,新密钥派生并写入,更新版本号 |
| 设备退役 | 已销毁 | ITS + PS | 擦除密钥元数据,触发不可恢复销毁 |
提示:密钥轮换时,务必先确保新密钥可用,再停用旧密钥。否则一旦更新中断,设备可能同时失去新旧密钥,导致安全存储不可访问。
四、误区与复盘
误区一:把 ITS 当普通 KV 存储用。ITS 容量有限,且通常不提供大块数据加密。把证书、日志、固件包塞进 ITS,会迅速耗尽空间,还会拖慢安全启动。正确做法是:小而关键的数据放 ITS,大而需要加密的数据放 PS。
误区二:认为 HUK 可以直接当应用密钥。HUK 是根密钥,必须通过 KDF 派生用途隔离的子密钥。直接使用 HUK 会破坏密钥分离原则,一旦某个应用密钥泄露,整个设备根信任都会受影响。
误区三:忽略密钥生命周期状态。很多团队只关注“密钥能不能用”,不关注“密钥是否已停用、是否已销毁”。在量产交付中,密钥销毁必须可审计、可验证,否则退役设备可能残留可用密钥。
复盘建议:在每次安全存储设计评审中,至少确认三件事:ITS 与 PS 的数据划分是否合理;密钥派生标签是否绑定了用途和版本;密钥销毁路径是否覆盖所有持久化副本。只有把这三件事闭环,PSA Secure Storage 才真正具备量产交付价值。