一、密钥管理概述

1.1 加密技术基础

做安全这么多年,我最常被问的一个问题是:密钥到底是个什么东西?

说白了,密钥就是一把数字锁的钥匙。你加密数据,就是用钥匙把箱子锁上;解密,就是用同一把钥匙(或者另一把配套的钥匙)打开。没有钥匙,谁也别想看到里面的内容。

现代加密技术分三大类,我直接拿表说事:

类型典型算法特点
对称加密AES, SM4, 3DES加密解密用同一把密钥,速度快,适合大数据量
非对称加密RSA, ECC, SM2公钥加密、私钥解密,速度慢,适合数字签名和密钥交换
哈希算法SHA-256, SM3, MD5(已弃用)不可逆,用于完整性校验、密码存储

我在早期项目里就吃过对称密钥管理的亏。当时为了省事,直接把 AES 密钥写死在配置文件里,结果内网被扫到,整个业务线的数据都得重配。从那以后我养成了一个习惯:密钥和代码必须分离,哪怕只是个小工具。

1.2 密钥生命周期——一条不能断的线

你想想看,一个密钥从出生到销毁,要经历多少环节?

我把它总结成六个阶段:生成 → 分发 → 使用 → 存储 → 轮换 → 销毁。任何一个环节出问题,整条链就断了。

核心原则:密钥生命周期管理不是考你怎么生成随机数,而是考你怎么让密钥在每一步都处于“受控状态”。

我们逐个来看:

  1. 生成——必须用真随机数,不能用伪随机。我在项目里见过有人用 rand() 生成密钥……那个项目后来被安全审计挂红牌。
  2. 分发——密钥怎么从生成者安全地送到使用者?TLS 通道、离线介质、或是基于非对称加密的密钥协商。千万不要明文网络传密钥。
  3. 使用——密钥在使用时不应该暴露在用户空间。最好由硬件安全模块(HSM)或安全飞地(如 Intel SGX)承载。
  4. 存储——存密钥比存数据更难。一般要用密钥加密密钥(KEK)来保护工作密钥。
  5. 轮换——密钥不能永久使用。比如 HTTPS 证书一年一换,AWS KMS 建议每 90 天轮换一次 CMK。
  6. 销毁——密钥退役后要彻底擦除。物理销毁硬盘、或者使用安全擦除 API,不能只是删除文件。

这里我必须强调一个坑:密钥轮换不是简单地覆盖旧密钥。

我曾经碰到一个客户,轮换时直接把新密钥覆盖了旧密钥的存储位置,结果旧密文再也解不开了。轮换的正确做法是:保留版本号,新密钥加密新数据,旧密钥继续解密老数据,直到所有老数据迁移完成。

一个小技巧:密钥版本号可以放在密文头部,比如 01|密文,这样解密时直接根据版本号查找对应密钥。很多云 KMS 就是这么干的。

1.3 一张图看清密钥生命周期

下面这张 SVG 图把六个阶段串起来了,箭头表示流转方向。建议你存下来,每次做密钥方案时对着它过一遍。

密钥生命周期总览 生成 分发 使用 存储 轮换 销毁 💡 关键点: · 生成必须用真随机,分发必须用安全通道 · 轮换要保留旧版本,销毁要不可恢复 密钥生命周期不是一次性的流程,而是持续的循环管理

⚠️ 注意:上图中的虚线箭头表示“轮换不是替换,而是叠加新版本”。很多人在这里翻车,我也是在线上事故之后才彻底理解的——旧密钥还在使用中的密文就是你的老客户,不能赶尽杀绝。

1.4 总结一下这一章

  • 加密技术三足鼎立:对称、非对称、哈希,各有各的战场。
  • 密钥生命周期是一条闭环管线:生成 → 分发 → 使用 → 存储 → 轮换 → 销毁,缺一不可。
  • 最容易被忽视的是 轮换与销毁——不是把事情做了就行,而是要做对。

这些基础概念,以后每一章都会用到。我的经验是:先把生命周期刻在脑子里,再去配置参数,才不会跑偏。