第2章 密钥管理基础:对称密钥、非对称密钥、密钥生命周期
聊密钥管理,得先说清楚两件事:密钥长什么样?密钥怎么活完一辈子?
对称密钥和非对称密钥是密码学的两根柱子。我刚开始接触HSM时,觉得对称密钥就是个“大家一起用的密码”,非对称密钥就是“公钥加密私钥解密”。后来在项目里吃过亏——密钥生命周期没管好,差点让生产系统瘫痪。今天咱们把这块掰碎了聊。
对称密钥与 非对称密钥:到底差在哪?
对称加密,加密和解密用同一个密钥。说白了就是一把锁一把钥匙。AES、SM4、DES都算。优点是快,硬件加速后几十Gbps很常见。缺点是密钥分发难——你把密钥发给对方,路上被人抄走,游戏结束。
非对称加密,用一对钥匙:公钥公开,私钥锁在保险柜里。RSA、ECC、SM2是典型。你想想看,A把公钥发给B,B用公钥加密,A用私钥解密——公钥随便截,没有私钥啥也解不开。但非对称慢,RSA 2048签名也就几千次/秒,和AES差几个数量级。
实际项目中我习惯混着用:非对称做密钥交换或数字签名,对称做大数据量加密。HSM里常见做法是用非对称保护对称密钥——把对称密钥用公钥加密后再传输,接收方用私钥解开。这叫“密钥wrap”。
| 对比项 | 对称密钥 | 非对称密钥 |
|---|---|---|
| 典型算法 | AES-256, SM4-128, 3DES | RSA-2048, ECC P-256, SM2 |
| 密钥长度 | 128 / 192 / 256 bit | 256~4096 bit(ECC较短) |
| 加解密速度 | 极快(硬件AES可达几十Gbps) | 慢(约1/100~1/1000对称) |
| 主要用途 | 数据加密、MAC计算 | 密钥交换、数字签名、证书 |
| 密钥管理难点 | 分发和存储 | 私钥保护、公钥信任链 |
密钥生命周期——从出生到销毁
光认识两类密钥不够,你得知道它们怎么过这一辈子。密钥不是永久有效的。我遇到过某客户10年没换数据库加密密钥,结果员工离职时把备份USB带回家,事后被审计发现还心大呢。密钥生命周期分这几个阶段:
- 生成——在HSM内部用真随机数发生器(TRNG)创建,避免软件随机种子预测。
- 分发——用安全通道(TLS / 密钥wrap / 物理接触)传给授权方。
- 使用——在加密、签名、解密时引用密钥标识(key ID)而非明文加载。
- 备份与恢复——用主密钥(KEK)加密后导出存储,恢复时在HSM内部解密。
- 轮换——定期或事件触发(如泄露风险)生成新密钥替代旧密钥。
- 撤销——标记密钥为“不再使用”,防止意外启用。
- 销毁——物理删除HSM内密钥材料,销毁备份介质或覆写。
避坑指南:我曾经接手过一个项目,对方用PKCS#11接口生成的对称密钥,备份时直接把密钥明文写进了配置文件。后来因为合规审计差点背处分。记住:
- 生成阶段一定要设置密钥属性(CKA_EXTRACTABLE = FALSE 等)。
- 轮换密钥后,旧密钥至少在过渡期内保留,用于解密历史数据。
- 销毁操作必须双人授权(HSM的M of N控制),防止恶意删除。
一张图说清密钥生命周期
下面这张图概括了核心流程,我在多个HSM集成项目里都用过类似图给客户讲解。你可以看到三个阶段:创建、在役、终结。每个阶段都有对应的管理动作。
用代码示例来理解生命周期
以OpenSSL命令行演示非对称密钥的生成与轮换,虽然真实HSM里不会这么裸,但原理相通:
# 生成RSA私钥(模拟HSM内生成)
openssl genpkey -algorithm RSA -out private.pem -pkeyopt rsa_keygen_bits:2048
# 提取公钥(类似分发公钥)
openssl rsa -pubout -in private.pem -out public.pem
# 轮换:生成新私钥并保留旧私钥解密历史数据
openssl genpkey -algorithm RSA -out private_new.pem -pkeyopt rsa_keygen_bits:2048
# 销毁旧私钥(物理安全擦除)
shred -u private_old.pem
密钥管理实践中的几个关键点
- 密钥分级:主密钥(KEK)加密工作密钥,工作密钥加密业务数据。我在项目里见过不少团队把所有密钥塞在一个层级里,结果一次泄露全完蛋。
- 密钥属性固化:生成时就把“可导出”“可签名”“可加密”定死。后面想改?HSM里改属性几乎不可能,这是好事。
- 备份的双人控制:HSM支持M of N恢复(比如5个人里有3人到场才能还原主密钥)。别偷懒只用一个人持密文,出车祸咋办?
- 审计日志不嫌多:每次密钥生成、加载、删除都记日志。不仅合规需要,出了问题排查也靠它。我当年排查一个性能问题,就是靠日志发现某服务每小时重新加载一遍所有密钥。
对称与非对称的差异,加上完整的生命周期管理,构成了密钥管理的骨架。你只要把这两个概念消化掉,后面学HSM API调用和SDK集成就会顺很多。嗯,这块别急,扎实了再往下走。