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 上构建可信的密钥管理方案。