4. 密钥管理基础

在 TF-M 的安全存储体系中,密钥管理并不是“把一把密钥存进 Flash”这么简单。它要回答四个基本问题:密钥从哪里来、如何被派生、存放在哪里、在什么条件下才能被使用。只有把密钥当作有生命周期的安全对象来管理,才能避免明文落盘、越权调用和密钥复用等风险。本节围绕密钥生命周期、密钥类型、密钥派生、密钥存储与使用四个维度展开,并给出常见标准与工程实践。

一、密钥生命周期:从生成到销毁的闭环

密钥生命周期描述一把密钥从产生到失效的全过程。典型阶段包括:生成、注册/导入、激活、使用、轮换、归档、吊销与销毁。每个阶段都有对应的安全要求:生成阶段必须使用可信随机源;导入阶段要防止明文暴露;使用阶段要限制调用主体与用途;销毁阶段要确保密钥材料不可恢复。

在 TF-M 中,密钥通常由安全处理环境(SPE)内的密钥管理服务统一托管。应用通过 PSA Crypto API 请求“生成密钥”或“导入密钥”,服务返回一个不透明的密钥句柄(key handle)。应用后续只持有句柄,不接触密钥材料本身。这种“句柄化”设计把密钥材料与调用者隔离,是生命周期管理的基础。

密钥生命周期的核心原则:密钥材料只在安全边界内出现,调用者只持有句柄;每个阶段都应有明确的授权、审计与失效策略。

二、密钥类型:按用途与形态分类

密钥类型决定了它能做什么、不能做什么。按用途可分为:加密密钥、解密密钥、签名密钥、验签密钥、MAC 密钥、派生密钥、包装密钥等。按形态可分为:对称密钥(如 AES 密钥)、非对称密钥对(如 ECDSA 私钥/公钥)、以及派生出的会话密钥。按保护级别还可分为:可导出密钥与不可导出密钥、持久密钥与易失密钥。

在 PSA Crypto 中,密钥类型由 psa_key_type_t 描述,例如 PSA_KEY_TYPE_AES、PSA_KEY_TYPE_ECC_KEY_PAIR。同时通过 psa_key_usage_t 限定用途,例如只允许加密、只允许签名,或允许导出公钥。类型与用途分离,使得同一把密钥不会被误用于其他算法。

分类维度典型取值安全含义
用途加密、解密、签名、验签、MAC、派生限制密钥可执行的操作,防止越权使用
形态对称密钥、非对称密钥对、会话密钥决定算法与存储结构
可导出性可导出、不可导出不可导出密钥材料永不离开安全边界
持久性持久密钥、易失密钥决定掉电后是否保留及存储位置

三、密钥派生:从根密钥到工作密钥

密钥派生(Key Derivation)是用一个高熵的根密钥或主密钥,通过确定性算法生成一个或多个子密钥的过程。它的价值在于:避免直接使用根密钥,降低单点泄露风险;同时可以为不同用途、不同设备、不同会话生成独立密钥。

常见标准包括 HKDF(RFC 5869)、NIST SP 800-108 的 KDF 模式,以及基于 AES-CMAC 的派生函数。在 TF-M 中,密钥派生通常通过 PSA Crypto 的 psa_key_derivation_* 接口完成,输入包括根密钥、盐值(salt)、上下文信息(info)和输出长度。派生结果可以作为会话密钥或子密钥使用,而根密钥始终不可导出。

/* 伪代码:使用 HKDF 派生会话密钥 */
psa_key_derivation_operation_t op = PSA_KEY_DERIVATION_OPERATION_INIT;
psa_key_derivation_setup(&op, PSA_ALG_HKDF(PSA_ALG_SHA_256));
psa_key_derivation_input_bytes(&op, PSA_KEY_DERIVATION_INPUT_SALT, salt, salt_len);
psa_key_derivation_input_key(&op, PSA_KEY_DERIVATION_INPUT_SECRET, root_key);
psa_key_derivation_input_bytes(&op, PSA_KEY_DERIVATION_INPUT_INFO, info, info_len);
psa_key_derivation_output_bytes(&op, session_key, 32);
psa_key_derivation_abort(&op);

派生过程中要特别注意:盐值和上下文信息应具有唯一性,避免不同用途派生出相同密钥;派生密钥的用途应与根密钥严格分离;派生操作本身不应泄露根密钥的任何比特。

四、密钥存储与使用:安全边界内的托管

密钥存储的核心矛盾是:密钥必须可被安全服务使用,但又不能被普通应用读取。TF-M 的解决方案是把密钥材料存放在安全存储区,并由密钥管理服务维护“句柄—材料—策略”的映射。持久密钥通常加密后写入安全 Flash 或受保护的 NVM;易失密钥只存在于安全 RAM 中,掉电即失。

使用密钥时,调用者通过句柄发起操作,服务在内部校验策略:调用者是否有权使用该密钥、操作是否在允许的用途范围内、密钥是否已激活。只有全部通过,才会在安全边界内执行密码运算。这样即使应用被攻破,也无法直接读取密钥材料。

工程建议:优先使用“生成密钥”而非“导入密钥”;优先使用不可导出密钥;为不同用途派生独立子密钥;为密钥设置明确的用途与算法限制。

五、常见误区与复盘

  • 误区一:把密钥当普通数据存。 明文密钥落盘后,任何能读 Flash 的攻击者都能获取。应使用安全存储与加密保护。
  • 误区二:一把密钥用到底。 加密、签名、派生共用同一密钥,会放大泄露影响。应按用途分离。
  • 误区三:忽略密钥生命周期。 密钥长期不轮换、不吊销,一旦泄露影响持续扩大。应制定轮换与销毁策略。
  • 误区四:派生时缺少唯一上下文。 不同设备或会话派生出相同密钥,导致跨设备重放或密钥复用。

复盘时可以用一张“密钥生命周期—类型—派生—存储—使用”的关系图来检查:每把密钥是否有明确的来源、用途、存储位置、使用条件和销毁方式。下面这张图把本节的核心概念组织为一条从根密钥到工作密钥、再到安全使用的链路,帮助建立整体认知。

TF-M 密钥管理:生命周期与安全边界 根密钥 / 主密钥 不可导出 · 高熵 密钥派生 KDF HKDF / SP800-108 工作密钥 / 会话密钥 按用途分离 · 可轮换 安全边界(SPE / 安全存储) 密钥管理服务 句柄 · 策略 · 用途 安全存储区 加密 NVM · 持久密钥 密码运算引擎 AES · ECC · MAC 应用 / 非安全域 仅持有句柄,不接触密钥材料 PSA Crypto API 生命周期 生成→使用→轮换→销毁 使用约束 用途 · 算法 · 调用者

总结来看,密钥管理基础可以浓缩为四句话:密钥是有生命周期的安全对象;密钥类型与用途必须严格绑定;密钥派生让根密钥与工作密钥分离;密钥存储与使用必须限制在安全边界内。掌握这四点,才能在 TF-M 上构建可信的密钥管理方案。