2. 密钥管理基础:对称与非对称密钥、密钥生成、存储、使用、销毁

聊密钥管理,其实就是在聊怎么伺候好一堆数字。

我们做密码的同学都知道,再牛逼的算法,密钥泄露了也白搭。我入行那会儿跟着前辈做项目,他就一句话让我记到现在——「密钥管理做不好,等于你家大门密码贴在门把手上」。话糙理不糙。

今天我们就来系统地捋一遍:对称密钥与非对称密钥到底有什么区别?密钥的完整生命周期该怎么做?

2.1 对称密钥 vs 非对称密钥

说白了,对称密钥就是「一把钥匙开一把锁」。加密和解密用的是同一个密钥。你想想看,这多快啊,AES-256加解密在HSM里跑,吞吐量能达到几十Gbps。但问题也来了——这把钥匙怎么安全地送到对方手上?

非对称密钥呢?它是「锁和钥匙分开」。公钥随便发,私钥自己藏好。你用我的公钥加密文件,全世界只有我能用私钥解开。这种设计天生解决了密钥分发的问题,但性能就呵呵了,RSA-2048签名每秒也就几万次,跟对称算法完全不在一个量级。

我在项目中踩过一次坑,团队非要图省事,直接用RSA-4096加密大文件。结果呢?每次加密都得等好几秒,用户直接骂娘。

后来改成「混合加密」,才把问题搞定。混合加密的思路是:

  • 用非对称密钥安全地交换一把临时对称密钥
  • 用这把对称密钥去做数据加密
  • 用完就销毁,一锤子买卖

这个模式,说实话,是HSM和KMS中最最常用的架构。

我的习惯: 对称密钥用AES-256-GCM,非对称密钥用ECC P-384或RSA-3072。别用RSA-1024了,那玩意在FIPS 140-2里已经退出了历史舞台。

2.2 密钥生成:弱随机就是自毁长城

密钥生成,可能很多人觉得不就是 random() 一把梭么?

嗯,如果你真这么干过,那你的系统大概率已经完了。软件库里的伪随机数生成器(PRNG),在暴力破解面前基本等于裸奔。我曾经接手过一个项目,整个集群的通信加密密钥都是基于时间戳生成的,破解起来比打开一个行李箱还快。

正确的做法是什么?

  1. 使用硬件真随机数发生器(TRNG)。HSM、TPM、现代CPU(比如Intel的RDRAND)都内置了TRNG。我个人推荐在HSM里生成密钥,因为它的熵源是物理随机,天底下没有两个人能生成同样的密钥。
  2. 密钥强度要符合标准。别图省事用128位的对称密钥,现在NIST的要求是至少192位,最好256位。非对称密钥,RSA至少3072位,ECC至少256位。
  3. 生成即登记。密钥一出生,马上在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(生命周期内) 导出、重复使用

为什么会这么严格?说白了,是为了防「平权泄露」。我曾经在项目中遇到过一个客户,他们把签名密钥直接拿来加密数据,结果签名用的私钥就被泄露了。私钥一泄露,整个系统的信任链就全断了,没办法恢复。

我曾经掉进的一个坑: 在做KMS迁移时,没有按用途拆分密钥。结果所有密钥都是万能钥匙——能加密、能签名、还能导出。审计的时候被判定不合规,所有密钥全部重生成。两周白干。

2.5 密钥销毁:不是delete那么简单

密钥销毁,说白了就是让密钥永远消失。很多人觉得 delete from table 就完了,其实远远不够。

HSM和KMS的销毁机制通常分两步:

  1. 逻辑销毁:在KMS里标记这个密钥为「已销毁」,所有引用它的应用立即报错。这一步是秒级的。
  2. 物理销毁:HSM内部擦除密钥材料。如果是硬件存储,还会触发物理自毁电路。

我建议你记住一个时间——销毁之前,必须保证所有用这个密钥加密的数据已经解密并重新加密。否则,密钥一销毁,那些数据就永远打不开了。我在一个金融机构做过顾问,他们有一次不小心销毁了归档数据的密钥,结果三年期的交易记录全废了。直接出了一个合规事故。

所以,无论HSM还是KMS,销毁操作必须设成「两阶段确认」:

  • 第一阶段:标记为待销毁,给一个宽限期(比如7天)
  • 第二阶段:宽限期内没有人救回来,才执行真正的物理销毁
我个人习惯: 在KMS里启用Key Deletion Delay(密钥删除延迟),至少设7天。这7天里,万一发现数据还没迁移,还有回旋的余地。

核心要点: 密钥的生命周期,从生成到销毁,每一步都必须留下审计日志。HSM负责安全执行,KMS负责策略管控和审计。二者缺一不可。

密钥生命周期管理流程 对称密钥生成 对称密钥存储 对称密钥使用 对称密钥销毁 非对称密钥对生成 私钥安全存储 签名/加密/密钥协商 私钥销毁 对称密钥:一把钥匙开一把锁,性能极佳,但分发困难 非对称密钥:公钥私钥分离,解决分发问题,但性能慢 混合加密 = 非对称密钥安全分发 + 对称密钥高速加密 HSM保证密钥物理安全;KMS保证密钥策略和审计合规