第3章 密钥生命周期管理(生成、分发、存储、销毁)
密钥这东西,说白了就是一把锁。锁从铸出来到报废扔掉,每一步都得盯着。PCI DSS对密钥生命周期管得很严——不是你随便生成个密码就能糊弄过去的。我做了这么多年安全审计,见过太多公司栽在生命周期某个环节上。
咱们这一章,就按四个阶段来拆:生成、分发、存储、销毁。每个阶段都有坑,咱们一个一个填。
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 的要求是「不可恢复」。你不能只删个文件目录——文件系统可能有备份,磁盘可能有残留。
我曾经看到有人把密钥文件移到回收站就当销毁了……嗯,审计时直接不合格。正确的做法分三步:
- 覆盖原存储位置:写入随机数据至少三次(DoD 5220.22-M 标准)。
- 从密钥管理系统吊销:在 HSM 或 KMS 中将密钥标记为「已销毁」并删除引用。
- 物理销毁介质:如果密钥存在专用加密设备(如加密机),需物理销毁设备或使其永久不可用。
有些密钥有备份副本。你销毁了主存储,但备份磁带里可能还有。所以销毁前必须确认所有副本都被处理了。我建议在密钥生命周期开始时就建立「销毁清单」,列出所有存储位置。
还有,销毁过程也得记日志。不能悄悄干掉,要记录谁发起的销毁、验证结果、见证人(如果有)。PCI DSS 要求销毁日志至少保存 3 年。
5. 审计日志——贯穿始终
密钥的生成、分发、存储、销毁,每一步都要记。我列了一个检查清单,每个环节必须包含的字段:
| 生命周期阶段 | 必须记录的字段 | 保存期限 |
|---|---|---|
| 生成 | 密钥ID、生成时间、HSM序列号、操作人、算法类型 | 至少7年 |
| 分发 | 源地址、目标地址、分发方式、密钥加密情况、操作人 | 至少3年 |
| 存储 | 存储位置、加密状态、访问时间、访问人、成功/失败 | 至少3年 |
| 销毁 | 销毁时间、销毁方式、验证结果、见证人、批准人 | 至少7年 |
日志最好用 JSON 格式统一输出,时间戳用 UTC。我一般会在每条日志里加一个
traceId,这样从生成到销毁能串联起来。审计人员查起来特别方便。
好了,密钥生命周期管理的四个阶段就这些。每个阶段你都得像看护婴儿一样盯着——生成要靠谱,分发要安全,存储要锁死,销毁要彻底。加上全程审计日志,PCI DSS 这一块儿就没问题了。