一、密钥管理概述
1.1 加密技术基础
做安全这么多年,我最常被问的一个问题是:密钥到底是个什么东西?
说白了,密钥就是一把数字锁的钥匙。你加密数据,就是用钥匙把箱子锁上;解密,就是用同一把钥匙(或者另一把配套的钥匙)打开。没有钥匙,谁也别想看到里面的内容。
现代加密技术分三大类,我直接拿表说事:
| 类型 | 典型算法 | 特点 |
|---|---|---|
| 对称加密 | AES, SM4, 3DES | 加密解密用同一把密钥,速度快,适合大数据量 |
| 非对称加密 | RSA, ECC, SM2 | 公钥加密、私钥解密,速度慢,适合数字签名和密钥交换 |
| 哈希算法 | SHA-256, SM3, MD5(已弃用) | 不可逆,用于完整性校验、密码存储 |
我在早期项目里就吃过对称密钥管理的亏。当时为了省事,直接把 AES 密钥写死在配置文件里,结果内网被扫到,整个业务线的数据都得重配。从那以后我养成了一个习惯:密钥和代码必须分离,哪怕只是个小工具。
1.2 密钥生命周期——一条不能断的线
你想想看,一个密钥从出生到销毁,要经历多少环节?
我把它总结成六个阶段:生成 → 分发 → 使用 → 存储 → 轮换 → 销毁。任何一个环节出问题,整条链就断了。
核心原则:密钥生命周期管理不是考你怎么生成随机数,而是考你怎么让密钥在每一步都处于“受控状态”。
我们逐个来看:
- 生成——必须用真随机数,不能用伪随机。我在项目里见过有人用
rand()生成密钥……那个项目后来被安全审计挂红牌。 - 分发——密钥怎么从生成者安全地送到使用者?TLS 通道、离线介质、或是基于非对称加密的密钥协商。千万不要明文网络传密钥。
- 使用——密钥在使用时不应该暴露在用户空间。最好由硬件安全模块(HSM)或安全飞地(如 Intel SGX)承载。
- 存储——存密钥比存数据更难。一般要用密钥加密密钥(KEK)来保护工作密钥。
- 轮换——密钥不能永久使用。比如 HTTPS 证书一年一换,AWS KMS 建议每 90 天轮换一次 CMK。
- 销毁——密钥退役后要彻底擦除。物理销毁硬盘、或者使用安全擦除 API,不能只是删除文件。
这里我必须强调一个坑:密钥轮换不是简单地覆盖旧密钥。
我曾经碰到一个客户,轮换时直接把新密钥覆盖了旧密钥的存储位置,结果旧密文再也解不开了。轮换的正确做法是:保留版本号,新密钥加密新数据,旧密钥继续解密老数据,直到所有老数据迁移完成。
一个小技巧:密钥版本号可以放在密文头部,比如 01|密文,这样解密时直接根据版本号查找对应密钥。很多云 KMS 就是这么干的。
1.3 一张图看清密钥生命周期
下面这张 SVG 图把六个阶段串起来了,箭头表示流转方向。建议你存下来,每次做密钥方案时对着它过一遍。
⚠️ 注意:上图中的虚线箭头表示“轮换不是替换,而是叠加新版本”。很多人在这里翻车,我也是在线上事故之后才彻底理解的——旧密钥还在使用中的密文就是你的老客户,不能赶尽杀绝。
1.4 总结一下这一章
- 加密技术三足鼎立:对称、非对称、哈希,各有各的战场。
- 密钥生命周期是一条闭环管线:生成 → 分发 → 使用 → 存储 → 轮换 → 销毁,缺一不可。
- 最容易被忽视的是 轮换与销毁——不是把事情做了就行,而是要做对。
这些基础概念,以后每一章都会用到。我的经验是:先把生命周期刻在脑子里,再去配置参数,才不会跑偏。