2. 安全存储基础
在嵌入式安全体系中,安全存储并不是简单地“把数据写进 Flash 再加密”,而是围绕密钥、证书、身份凭据、配置策略和运行状态建立的一套受保护的数据生命周期管理机制。TF-M(Trusted Firmware-M)中的安全存储(Secure Storage)位于 PSA Certified 安全服务框架内,向上为安全分区和非安全应用提供受控访问接口,向下管理受保护存储介质、加密引擎和完整性校验逻辑。理解安全存储,首先要回答三个问题:保护什么、防谁、达到什么安全目标。
一、安全存储的基本概念
安全存储的核心对象通常包括:设备唯一密钥、对称密钥、非对称私钥、X.509 证书、PSA 密钥标识(key ID)、安全配置项、可信启动度量值以及持久化安全状态。这些数据具有一个共同特征:一旦泄露、被篡改或不可用,整个设备信任链就会崩塌。
从实现层次看,安全存储一般由以下部分组成:
- 存储介质层:内部 Flash、外部 Flash、OTP/eFuse、受保护 RAM 或安全元件。
- 加密保护层:使用设备密钥对数据做加密,保证机密性。
- 完整性保护层:通过 MAC、AEAD 标签或哈希树检测篡改。
- 访问控制层:基于分区、UID、策略和 PSA 接口限制“谁能读写哪些对象”。
- 生命周期管理层:支持创建、读取、更新、删除、回滚保护和抗掉电一致性。
TF-M 的安全存储通常与内部可信存储(ITS, Internal Trusted Storage)和保护存储(PS, Protected Storage)配合使用。ITS 面向小体积、高敏感数据,PS 面向较大对象和外部存储场景。二者都通过 PSA Storage API 暴露统一语义。
二、威胁模型:安全存储到底防谁
安全存储的威胁模型必须明确攻击者能力边界。典型攻击者包括:
- 远程软件攻击者:通过漏洞越权调用存储接口,读取或篡改他人密钥。
- 本地物理攻击者:通过调试口、探针、侧信道或故障注入获取密钥。
- 供应链攻击者:在制造或固件更新阶段植入恶意配置或回滚旧版本。
- 非安全世界攻击者:利用非安全应用发起对安全存储的非法访问。
对应的防护假设是:安全世界代码与数据在运行时受到 TrustZone 隔离保护;设备密钥在生命周期内不可被非安全世界读取;存储介质可能被读取或改写,但攻击者无法在安全世界内部执行任意代码。基于这一模型,安全存储必须同时满足机密性、完整性和可用性。
三、机密性、完整性与可用性要求
| 安全目标 | 保护对象 | 典型机制 | 失败后果 |
|---|---|---|---|
| 机密性 | 私钥、对称密钥、证书、配置 | AEAD 加密、密钥派生、HUK 保护 | 密钥泄露、身份伪造 |
| 完整性 | 密钥元数据、策略、版本号 | MAC、AEAD 标签、哈希树、签名校验 | 篡改策略、降级攻击 |
| 可用性 | 关键密钥、启动配置 | 掉电一致性、冗余副本、抗回滚计数器 | 设备变砖、拒绝服务 |
三者并非孤立。例如,只加密不校验完整性,攻击者可以翻转密文导致解密后数据异常;只校验完整性不加密,密钥内容仍会泄露;只做加密和完整性而不考虑掉电,更新过程中断电可能造成密钥永久损坏。因此 TF-M 安全存储通常采用“加密 + 认证 + 原子更新”的组合策略。
四、典型应用场景与配置示例
安全存储在设备中通常出现在以下场景:安全启动度量值存储、TLS 客户端私钥保存、设备身份证书管理、OTA 更新密钥保护、安全配置持久化、可信执行环境中的密钥句柄管理。以 PSA 存储接口为例,应用通过 key ID 访问密钥,而不是直接接触明文:
psa_status_t status;
psa_key_id_t key_id = 0x1001;
status = psa_crypto_init();
if (status != PSA_SUCCESS) {
/* 初始化失败,安全存储不可用 */
}
status = psa_generate_key(key_id, PSA_KEY_TYPE_AES,
PSA_ALG_GCM, PSA_KEY_USAGE_ENCRYPT,
NULL, 0);
if (status != PSA_SUCCESS) {
/* 密钥生成失败,检查存储空间与策略 */
}
在这段代码中,应用只持有 key ID,真正的密钥材料由安全存储和密码服务在安全世界内管理。即使非安全应用被攻破,也无法直接读出密钥明文。
五、常见误区与复盘
- 误区一:加密就等于安全存储。加密只解决机密性,完整性、访问控制和抗回滚同样关键。
- 误区二:把密钥存在普通 Flash 再加密即可。如果加密密钥也放在同一介质,攻击者可以一并提取。
- 误区三:忽略掉电一致性。密钥更新过程中断电,可能导致旧密钥已删、新密钥未写入。
- 误区四:认为安全存储性能无关紧要。频繁写入会加速 Flash 磨损,需结合缓存和批量更新策略。
总结来看,安全存储是 TF-M 信任链中承上启下的关键环节:向上支撑密钥管理和安全服务,向下依赖密码引擎与受保护介质。只有同时明确保护对象、攻击者能力和机密性/完整性/可用性目标,才能设计出既安全又可持续运行的安全存储方案。