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 暴露统一语义。

TF-M 安全存储:分层结构、数据流与威胁面 非安全应用 / 安全分区 PSA Crypto API PSA Storage API Attestation / 配置 安全中断 / 状态 受控调用 TF-M 安全存储服务层 ITS 内部可信存储 小对象 / 高敏感 PS 保护存储 大对象 / 外部介质 访问控制 / UID 策略与隔离 生命周期管理 创建/更新/删除 加密 + 完整性保护 密码与保护层 设备密钥 / HUK 密钥派生 AEAD 加密 AES-GCM / CCM MAC / 哈希树 防篡改检测 抗回滚计数器 版本保护 存储介质 内部 Flash 外部 Flash OTP / eFuse 受保护 RAM / SE 威胁面:物理探测、总线窃听、固件回滚、越权访问、掉电破坏

二、威胁模型:安全存储到底防谁

安全存储的威胁模型必须明确攻击者能力边界。典型攻击者包括:

  • 远程软件攻击者:通过漏洞越权调用存储接口,读取或篡改他人密钥。
  • 本地物理攻击者:通过调试口、探针、侧信道或故障注入获取密钥。
  • 供应链攻击者:在制造或固件更新阶段植入恶意配置或回滚旧版本。
  • 非安全世界攻击者:利用非安全应用发起对安全存储的非法访问。

对应的防护假设是:安全世界代码与数据在运行时受到 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 信任链中承上启下的关键环节:向上支撑密钥管理和安全服务,向下依赖密码引擎与受保护介质。只有同时明确保护对象、攻击者能力和机密性/完整性/可用性目标,才能设计出既安全又可持续运行的安全存储方案。