第3章 密钥生命周期管理(生成、分发、存储、销毁)

密钥这东西,说白了就是一把锁。锁从铸出来到报废扔掉,每一步都得盯着。PCI DSS对密钥生命周期管得很严——不是你随便生成个密码就能糊弄过去的。我做了这么多年安全审计,见过太多公司栽在生命周期某个环节上。

咱们这一章,就按四个阶段来拆:生成、分发、存储、销毁。每个阶段都有坑,咱们一个一个填。

密钥生命周期流程图 密钥生命周期管理流程 密钥生成 HSM / 强随机数 密钥分发 加密通道 + 密钥拆分 密钥存储 HSM / 加密数据库 密钥使用 解密 / 签名 / TLS 密钥销毁 覆写 / 物理销毁 每个阶段都必须记录审计日志:谁、什么时间、做了什么、结果如何 流程方向

1. 密钥生成——起点别歪

密钥生成是整个生命周期的地基。地基不稳,后面全白搭。PCI DSS 要求密钥必须使用经过认证的加密模块(比如 FIPS 140-2 Level 3 的 HSM)生成。不能用软件随机数生成器糊弄。

我个人习惯用硬件安全模块(HSM)生成主密钥。有一次帮一个金融客户做审计,他们居然用 openssl rand 生成了支付数据的加密密钥——那台服务器还是虚拟机。你想想看,虚拟机的熵池够不够?我当场让他们停了。

  • 熵源要求:必须使用硬件随机数生成器(TRNG)或符合 NIST SP 800-90A/B/C 的 DRBG。
  • 算法合规:AES-256、RSA-2048+、ECC P-256 及以上。
  • 审计日志:记录生成时间、使用的模块、生成者身份(密钥管理员)、密钥标识。
⚠ 避坑指南
我曾经遇到一个团队,他们把 AES 密钥用 /dev/urandom 生成。虽说 urandom 在 Linux 上质量还行,但 PCI 审计时直接亮了红灯——因为没有使用硬件熵源。记住:能用 HSM 就别用软件,除非你做了熵源认证。

2. 密钥分发——路上别丢

密钥从 A 传送到 B,这条通道必须加密。PCI DSS 要求使用密钥加密密钥(KEK)来保护传输中的密钥。说白了,就是把要传的密钥用另一把锁锁起来。

我建议采用密钥拆分(Key Splitting)机制。比如把私钥切成三片,分别走三条不同路径传输,接收方再合并。这招能防单点泄露。

常见密钥分发方式对比
方式 安全等级 复杂度 审计日志要求
TLS 加密传输 中 低 记录发送/接收方、时间、密钥哈希
KEK 封装 高 中 需记录 KEK 的使用次数、密钥解密操作
密钥拆分 + 独立通道 极高 高 每片拆分后单独记录分发日志
💡 个人经验
我做过一个跨国项目,他们用 SSH 传输密钥文件。表面上看没问题,但审计时发现 SSH 密钥本身没做生命周期管理——成了悖论。最后我们搭了一套自动化的 KEK 分发管道,每次分发都生成审计事件。

3. 密钥存储——锁在保险柜里

密钥存下来以后最怕什么?被人读走。PCI DSS 明确要求密钥以加密形式存储,并且访问控制要做到最小权限。我个人推荐用 HSM 或者专用的密钥管理服务(KMS)。

如果不用硬件,那就得靠软件加密。比如用数据库字段加密存储密钥,但密钥本身的加密密钥(KEK)要放在一个独立的安全区域(如 vault)。嗯,这里要注意:永远不要让应用直接拿到明文密钥。

// 伪代码示例:使用 KEK 加密存储工作密钥
function storeKey(plainKey, kekId) {
    const kek = hsm.unwrap(kekId); // 从 HSM 获取 KEK
    const encryptedKey = aes256GcmEncrypt(plainKey, kek);
    // 审计日志
    auditLog('KEY_STORE', {
        keyId: generateKeyId(),
        kekId: kekId,
        timestamp: new Date().toISOString(),
        operator: session.user
    });
    database.save({ keyId, encryptedBlob, kekId });
}
  • 加密存储:使用 AES-256-GCM 或类似算法,IV 随机生成。
  • 访问控制:只有授权的密钥管理服务可以通过 API 访问,应用不能直接连数据库。
  • 定期轮换:存储的 KEK 每隔 1-3 年轮换一次。
✅ 最佳实践
把密钥存储和日志存储分开。密钥放 HSM 或专用 vault,审计日志放另一个系统。这样就算日志被篡改,密钥还在保险柜里。

4. 密钥销毁——死要见尸

密钥过期了、轮换了、或者业务终止了,必须彻底销毁。PCI DSS 的要求是「不可恢复」。你不能只删个文件目录——文件系统可能有备份,磁盘可能有残留。

我曾经看到有人把密钥文件移到回收站就当销毁了……嗯,审计时直接不合格。正确的做法分三步:

  1. 覆盖原存储位置:写入随机数据至少三次(DoD 5220.22-M 标准)。
  2. 从密钥管理系统吊销:在 HSM 或 KMS 中将密钥标记为「已销毁」并删除引用。
  3. 物理销毁介质:如果密钥存在专用加密设备(如加密机),需物理销毁设备或使其永久不可用。
⚠ 关键警告
有些密钥有备份副本。你销毁了主存储,但备份磁带里可能还有。所以销毁前必须确认所有副本都被处理了。我建议在密钥生命周期开始时就建立「销毁清单」,列出所有存储位置。

还有,销毁过程也得记日志。不能悄悄干掉,要记录谁发起的销毁、验证结果、见证人(如果有)。PCI DSS 要求销毁日志至少保存 3 年。

5. 审计日志——贯穿始终

密钥的生成、分发、存储、销毁,每一步都要记。我列了一个检查清单,每个环节必须包含的字段:

生命周期阶段 必须记录的字段 保存期限
生成 密钥ID、生成时间、HSM序列号、操作人、算法类型 至少7年
分发 源地址、目标地址、分发方式、密钥加密情况、操作人 至少3年
存储 存储位置、加密状态、访问时间、访问人、成功/失败 至少3年
销毁 销毁时间、销毁方式、验证结果、见证人、批准人 至少7年
💡 我的习惯
日志最好用 JSON 格式统一输出,时间戳用 UTC。我一般会在每条日志里加一个 traceId,这样从生成到销毁能串联起来。审计人员查起来特别方便。

好了,密钥生命周期管理的四个阶段就这些。每个阶段你都得像看护婴儿一样盯着——生成要靠谱,分发要安全,存储要锁死,销毁要彻底。加上全程审计日志,PCI DSS 这一块儿就没问题了。