2、密钥管理基础概念归纳总结
2.1 密钥的生命周期管理
做接口安全,绕不开密钥。说白了,密钥就是一把“数字钥匙”。谁拿着这把钥匙,谁就能调用你的接口、访问你的数据。你问我密钥管理的第一步是什么?我个人习惯把密钥的整个使用过程,拆成六个阶段来管。这六个阶段要形成一个闭环。
我遇到过最惨的一次事故,就是因为密钥轮换没做好。业务方拿着一个三年前生成的密钥还在调接口,结果密钥早就在内部泄露了。从那以后,我对自己团队的要求是:任何一个密钥,从出生到死亡,都必须有记录、有审批、可追溯。
下面这个表,是我梳理出来的密钥生命周期六阶段。你仔细看,每个阶段都对应着一道技术防线。
| 阶段 | 关键动作 | 必须留下的记录 |
|---|---|---|
| 1. 生成 | 使用高强度算法生成,禁止明文硬编码 | 生成时间、算法、申请工单ID |
| 2. 分发 | 通过加密通道下发,传输过程要签名 | 分发目标ID、传输通道指纹 |
| 3. 使用 | 运行时存储在专用安全区域(如HSM/KMS) | 调用记录、调用方IP、时间戳 |
| 4. 轮换 | 过期后自动生成新密钥,旧密钥标记为“待退役” | 轮换策略、生效时间、灰度范围 |
| 5. 归档 | 停用的密钥加密后归档存储,用于解密历史数据 | 归档时间、解封审批记录 |
| 6. 销毁 | 确认无依赖后,执行物理销毁或加密擦除 | 销毁经办人、复核人、日志哈希 |
2.2 密钥分类与分级
你是不是经常困惑,为什么有的密钥叫 access_key,有的叫 sign_key?其实就是用途不一样。我个人习惯把密钥先分层,再分类。分层是为了防风险,分类是为了定权限。
2.2.1 按加密方式分类
- 对称密钥: 加解密用同一把钥匙。常见的算法有 AES、SM4。它的优势是快,劣势是传输风险高。我一般只在服务间内部通信时用对称密钥。
- 非对称密钥: 分成公钥和私钥。公钥随便给人,私钥自己藏好。常用的有 RSA、ECC、SM2。它的优势是解决了密钥分发难题,劣势是慢。接口签名验证我首选非对称密钥。
- 混合密钥: 比如 HTTPS 的 TLS 握手过程。用非对称密钥协商对称会话密钥,后续通信用对称加密。这是目前最优解。
2.2.2 按安全等级分级
做过系统架构的都知道,所有密钥都放在同一个保险柜里是危险的。一旦一个被攻破,其他全部沦陷。所以,我通常把密钥分为三个等级,分级管理。
| 等级 | 描述 | 存储保护要求 |
|---|---|---|
| L1 根密钥 | 密钥的密钥。用于加密其他密钥。 | 必须放在HSM硬件安全模块中,双人操作才能使用。 |
| L2 主密钥 | 加密特定的业务数据或数据库字段。 | 由L1加密存储,运行时解密到内存,用后立刻清空。 |
| L3 数据密钥 | 临时生成,加密一条或一批具体记录。 | 随用随生成,用完即销毁,不留存。 |
2.3 密钥与API权限的关联
刚才聊的都是“钥匙”本身的属性。接下来我们要把钥匙和门锁联系起来。门锁就是API权限,钥匙就是你的密钥。
我经常看到一些团队只验证密钥是否合法,不验证密钥的权限范围。这就好比保安只看你是不是拿着门禁卡就放你进,根本不关心你进的是财务室还是机房。
一个完整的API调用请求,通常包含下面几个元素。密钥管理要管好前三项。
- 密钥标识(Access Key ID):谁在调用?
- 签名数据(Signature):调用内容是否被篡改?
- 时间戳(Timestamp):请求是否在有效期内?
- 业务参数(Payload):具体执行什么操作。
举个例子。你在网关层面收到一个请求,你查出这个 ak_id 属于小王。但小王只有“读取订单”的权限。他这回却想调用“删除订单”接口。网关会怎么做?会直接拒绝。这才是密钥和权限结合的正确姿势。
那么,如何把密钥、用户、权限这三个东西串起来?我通常用一个抽象模型来设计。下面这个SVG图,就是我一般的做法。
2.4 必须记住的几个核心概念
这一节内容比较多,我帮你总结一下,后面做审计和双人审批都会用到的核心点。你可以把它当成一个速查清单。
- 密钥标识(Key ID): 不保密,用来查你是谁。
- 密钥材料(Secret Key / Private Key): 必须保密,用来验证是不是你本人。这就是我们后面审批流程里要重点保护的对象。
- 签名(Signature): 用密钥对请求内容计算出的摘要。用来证明请求在传输过程中没被人改过。
- 时效性(ExpireTime): 密钥和签名都有过期时间。我见过很多因为服务器时间不准导致签名验证失败的坑,记得统一治理NTP。
- 审计点(Audit Point): 密钥生成、权限变更、密钥销毁这三个节点,是双人审批的刚性门槛,一个都不能省。
2.5 一个小提醒
很多新手以为密钥管理是运维的事。不对。你是接口的开发者、调试者,你是第一道防线。如果你写的代码里边硬编码了密钥,那KMS再强也救不了你。我在Code Review中对硬编码密钥是零容忍的,直接打回。
好了,把这几个基础概念吃透。后面咱们聊双人审批接口调试的时候,你就能很快理解为什么会有那些复杂的设计了。