2. 密钥管理基础:对称与非对称密钥、密钥生成、存储、使用、销毁
聊密钥管理,其实就是在聊怎么伺候好一堆数字。
我们做密码的同学都知道,再牛逼的算法,密钥泄露了也白搭。我入行那会儿跟着前辈做项目,他就一句话让我记到现在——「密钥管理做不好,等于你家大门密码贴在门把手上」。话糙理不糙。
今天我们就来系统地捋一遍:对称密钥与非对称密钥到底有什么区别?密钥的完整生命周期该怎么做?
2.1 对称密钥 vs 非对称密钥
说白了,对称密钥就是「一把钥匙开一把锁」。加密和解密用的是同一个密钥。你想想看,这多快啊,AES-256加解密在HSM里跑,吞吐量能达到几十Gbps。但问题也来了——这把钥匙怎么安全地送到对方手上?
非对称密钥呢?它是「锁和钥匙分开」。公钥随便发,私钥自己藏好。你用我的公钥加密文件,全世界只有我能用私钥解开。这种设计天生解决了密钥分发的问题,但性能就呵呵了,RSA-2048签名每秒也就几万次,跟对称算法完全不在一个量级。
我在项目中踩过一次坑,团队非要图省事,直接用RSA-4096加密大文件。结果呢?每次加密都得等好几秒,用户直接骂娘。
后来改成「混合加密」,才把问题搞定。混合加密的思路是:
- 用非对称密钥安全地交换一把临时对称密钥
- 用这把对称密钥去做数据加密
- 用完就销毁,一锤子买卖
这个模式,说实话,是HSM和KMS中最最常用的架构。
2.2 密钥生成:弱随机就是自毁长城
密钥生成,可能很多人觉得不就是 random() 一把梭么?
嗯,如果你真这么干过,那你的系统大概率已经完了。软件库里的伪随机数生成器(PRNG),在暴力破解面前基本等于裸奔。我曾经接手过一个项目,整个集群的通信加密密钥都是基于时间戳生成的,破解起来比打开一个行李箱还快。
正确的做法是什么?
- 使用硬件真随机数发生器(TRNG)。HSM、TPM、现代CPU(比如Intel的RDRAND)都内置了TRNG。我个人推荐在HSM里生成密钥,因为它的熵源是物理随机,天底下没有两个人能生成同样的密钥。
- 密钥强度要符合标准。别图省事用128位的对称密钥,现在NIST的要求是至少192位,最好256位。非对称密钥,RSA至少3072位,ECC至少256位。
- 生成即登记。密钥一出生,马上在KMS里登记它的ID、用途、允许的操作、有效期。我见过最惨的案例,就是有人生成了1000个密钥,一个都没登记,最后全炸了。
一句话总结: 密钥生成这个环节,没有任何妥协的余地。HSM负责生成,KMS负责记账,两边必须同时在线。
2.3 密钥存储:安全的第一道防线
密钥存哪儿,这是个要命的问题。
我见过最可怕的场景是,有人把私钥直接写在配置文件里,明文、base64都没做,就放在Git仓库里。结果开发用的密钥被人扒下来,直接连到了生产环境的数据库。
存储密钥的正确姿势分两种场景:
- HSM场景:密钥永远不出设备。HSM内部有防篡改机制,物理拆解会导致密钥自毁。应用层只拿到一个Key Handle(密钥句柄),就是一个索引号。你要签名、加密,全靠这个handle去调用HSM的API。
- KMS场景:密钥可以被加密导出,但密钥本身必须用主密钥(CMK)加密后再存到数据库里。换句话说,数据库里存的是一堆「密钥的密文」,真正的密钥在KMS的内存里。
说到这里,我建议你记住一个原则——密钥永远不能出现在日志里。我在某大厂做过代码审计,发现有人为了调试,把加密后的密钥直接打印到日志文件里。虽然加密了,但这种行为,在合规审查面前是致命的。
2.4 密钥使用:按需授权,最小权限
密钥是用来干活儿的,不是用来展览的。
在HSM和KMS的世界里,每一个密钥从被创建那一刻起,就绑定了它「能做什么、不能做什么」。比如:
| 密钥用途 | 允许的操作 | 禁止的操作 |
|---|---|---|
| 签名密钥 | Sign、Verify | Encrypt、Decrypt、Export |
| 加密密钥 | Encrypt、Decrypt | Sign、Export |
| 主密钥(CMK) | GenerateDataKey、Encrypt/Decrypt子密钥 | 直接用于应用数据加密 |
| 临时会话密钥 | Encrypt、Decrypt(生命周期内) | 导出、重复使用 |
为什么会这么严格?说白了,是为了防「平权泄露」。我曾经在项目中遇到过一个客户,他们把签名密钥直接拿来加密数据,结果签名用的私钥就被泄露了。私钥一泄露,整个系统的信任链就全断了,没办法恢复。
2.5 密钥销毁:不是delete那么简单
密钥销毁,说白了就是让密钥永远消失。很多人觉得 delete from table 就完了,其实远远不够。
HSM和KMS的销毁机制通常分两步:
- 逻辑销毁:在KMS里标记这个密钥为「已销毁」,所有引用它的应用立即报错。这一步是秒级的。
- 物理销毁:HSM内部擦除密钥材料。如果是硬件存储,还会触发物理自毁电路。
我建议你记住一个时间——销毁之前,必须保证所有用这个密钥加密的数据已经解密并重新加密。否则,密钥一销毁,那些数据就永远打不开了。我在一个金融机构做过顾问,他们有一次不小心销毁了归档数据的密钥,结果三年期的交易记录全废了。直接出了一个合规事故。
所以,无论HSM还是KMS,销毁操作必须设成「两阶段确认」:
- 第一阶段:标记为待销毁,给一个宽限期(比如7天)
- 第二阶段:宽限期内没有人救回来,才执行真正的物理销毁
核心要点: 密钥的生命周期,从生成到销毁,每一步都必须留下审计日志。HSM负责安全执行,KMS负责策略管控和审计。二者缺一不可。