1. 课程导入
在物联网设备中,安全存储与密钥管理是整条信任链的“根”。无论是设备身份认证、固件安全启动、安全通信,还是远程证明与安全升级,最终都依赖于一个可信的密钥与数据存储底座。TF-M(Trusted Firmware-M)作为 Arm 平台安全架构(PSA)在 Cortex-M 上的参考实现,把安全存储与密钥管理作为其核心安全服务之一,为资源受限的 MCU 提供标准化、可认证的安全能力。
本课程围绕 TF-M 的安全存储(Secure Storage)与密钥管理(Key Management)展开,从概念、架构、接口、实现到调试与排障,逐层建立完整的知识体系。第 1 章作为导入,重点回答三个问题:TF-M 安全存储与密钥管理“是什么”、“为什么重要”、“整体如何组织”。
一、核心定义:安全存储与密钥管理在 TF-M 中的位置
TF-M 将系统划分为安全处理环境(SPE)与非安全处理环境(NSPE),并通过 PSA 接口向应用暴露安全服务。安全存储与密钥管理属于 SPE 中的安全服务,通常由以下组件构成:
- PSA Crypto:提供密钥生成、导入、导出、加解密、签名验签、哈希等密码学操作。
- PSA Internal Trusted Storage(ITS):存储设备内部可信的小块数据,如密钥句柄、计数器、配置标志。
- PSA Protected Storage(PS):存储需要机密性与完整性保护的应用数据,支持更大容量与更灵活的生命周期管理。
- 密钥管理:负责密钥的生成、派生、存储、使用策略与销毁,确保密钥永不离开安全边界。
简单来说,ITS 解决“可信小数据放哪里”,PS 解决“受保护大数据放哪里”,PSA Crypto 解决“密钥怎么用”,三者共同构成 TF-M 的安全存储与密钥管理能力。
核心思想:密钥与敏感数据不暴露给非安全世界,所有密码学操作在安全边界内完成,应用只持有句柄,不持有明文密钥。
二、整体知识框架:从接口到实现的五层结构
为了便于学习,我们可以把本课程的知识框架抽象为五层:应用接口层、服务层、密钥与存储管理层、硬件抽象层、信任根层。下图展示了 TF-M 安全存储与密钥管理的整体结构关系。
从图中可以看到,非安全应用通过 PSA 接口发起请求,安全服务层进行策略检查后,由密钥与存储管理层完成实际的密钥操作与数据保护,最终落到硬件抽象层与信任根。这种分层设计使得安全存储与密钥管理既具备标准化接口,又能适配不同芯片平台。
三、典型场景:为什么物联网设备离不开它
以一个智能门锁为例,设备需要与云端进行双向认证、接收加密的开门指令、保存本地用户凭证,并支持固件安全升级。如果没有 TF-M 的安全存储与密钥管理,常见做法是把密钥硬编码在固件中或明文存放在 Flash,一旦固件被读取,密钥即泄露,攻击者可伪造设备或解密通信。
引入 TF-M 后,设备私钥在安全边界内生成并存储,应用只能通过句柄调用签名接口;用户凭证存入 PS,具备机密性与完整性保护;升级镜像的验签公钥由信任根保护。这样即使非安全世界被攻破,攻击者也无法直接导出密钥。
| 能力 | 对应组件 | 典型用途 | 关键属性 |
|---|---|---|---|
| 密钥生成与使用 | PSA Crypto | 设备身份、TLS、签名验签 | 密钥不出安全边界 |
| 可信小数据存储 | PSA ITS | 密钥句柄、计数器、标志位 | 完整性、防回滚 |
| 受保护应用数据存储 | PSA PS | 用户凭证、配置、证书 | 机密性、完整性、生命周期 |
| 信任根与硬件支撑 | HUK、TRNG、安全计数器 | 密钥派生、随机数、防重放 | 不可导出、不可篡改 |
四、学习目标与常见误区
完成本课程后,学习者应能够:理解 TF-M 安全存储与密钥管理的整体架构;掌握 PSA Crypto、ITS、PS 三类接口的调用方式与差异;能够配置存储后端与密钥策略;能够定位常见的密钥导入失败、存储空间不足、访问被拒绝等问题。
常见误区一:把 ITS 当作通用文件系统使用。ITS 适合小块、高频、可信数据,不适合大文件或频繁写入的大数据量场景。
常见误区二:认为密钥句柄就是密钥本身。句柄只是索引,真正的密钥材料始终保存在安全存储中,不能通过句柄直接读取明文。
常见误区三:忽略生命周期管理。密钥的生成、使用、轮换、销毁需要完整策略,否则会出现旧密钥残留或权限过大的问题。
下面是一段典型的 PSA Crypto 密钥生成与使用的伪代码,帮助建立初步印象:
psa_status_t status;
psa_key_id_t key_id;
psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1));
psa_set_key_bits(&attr, 256);
psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_SIGN_HASH);
psa_set_key_algorithm(&attr, PSA_ALG_ECDSA(PSA_ALG_SHA_256));
status = psa_generate_key(&attr, &key_id);
if (status != PSA_SUCCESS) {
/* 处理密钥生成失败 */
}
/* 后续使用 key_id 进行签名,密钥明文不离开安全存储 */
从这段代码可以看出,应用只接触属性与句柄,不接触密钥材料。这正是 TF-M 安全存储与密钥管理的设计精髓:把复杂性留在安全世界,把简单、安全的接口留给应用。