第3章:常见密钥类型及生命周期
聊密钥审计之前,咱们先把基础夯实。你想想看,如果连被测对象是什么类型的密钥都分不清,后面的接口测试方向很容易跑偏。这一章我就带你把常见的密钥类型梳理一遍,再把它们的“一生”串起来讲清楚。
3.1 常见密钥类型:你会在接口中遇到哪些“钥匙”
我在项目中见过的密钥,按用途可以归为四大类。每一类在审计接口测试中的关注点都不一样。
| 密钥类型 | 典型算法 | 接口测试关注点 | 一句话场景 |
|---|---|---|---|
| 对称密钥 | AES-256, SM4, DESede | 密钥是否硬编码、轮换周期是否可配置 | 加密请求体、解密响应体 |
| 非对称密钥对 | RSA-2048, ECC, SM2 | 私钥存储位置、公钥分发链路是否可审计 | 数字签名验签、TLS 握手 |
| 哈希密钥/HMAC | HMAC-SHA256, SM3 | 密钥种子是否定期更换、盐值是否随机 | API 签名校验、数据完整性校验 |
| 数字证书 | X.509 v3, PEM/P12 | 证书链是否完整、吊销状态是否可查询 | mTLS 双向认证、代码签名 |
我的一点经验: 对称密钥和非对称密钥经常被搞混。我记得有一次帮团队排查接口签名失败的问题,折腾了半天才发现他们在 HMAC 计算时用了非对称密钥的私钥去签名——算法都不匹配,怎么可能通过验证?做测试前,先确认密钥的类型和算法族。
3.2 对称密钥:一把钥匙开两把锁
对称密钥加密和解密用的是同一把密钥。好处是快,坏处是——只要密钥泄露,整个通信就裸奔了。
接口测试中的常见藏身之处:
- 接口请求体的加密字段(比如支付密码、身份证号)
- 配置文件中写死的 AES 密钥
- 环境变量中随手放着的 base64 密钥串
避坑指南: 我曾经见过一个金融项目,对称密钥直接写死在 Java 代码的 static final 变量里。编译后的 JAR 包用 JD-GUI 一拖——密钥清晰可见。你想想看,这种场景下就算接口测试全绿,安全审计也过不了。
3.3 非对称密钥对:公钥公开,私钥藏好
非对称密钥是成对出现的。公钥随便发,私钥匙打死不能出门。
接口测试中,非对称密钥主要用在两个地方:
- 数字签名:私钥签名,公钥验签。测试时要验证签名算法是否是固定值(比如 RSAwithSHA256),以及签名失败时的错误码。
- 密钥协商:比如 ECDHE 握手过程中生成了会话密钥。这时候要关注会话密钥的生成策略是否每次都不同。
3.4 哈希密钥与 HMAC:不只是算个摘要
很多人以为 HMAC 就是把密钥拼在数据后面算个哈希。其实 HMAC 有标准的构造方式(H(K XOR opad || H(K XOR ipad || msg)))。
接口签名签名常见的场景是:
- API 网关校验请求的签名头
- Webhook 回调的 payload 校验
测试要点:密钥种子要支持轮换、盐值不能固定、签名算法版本要可动态切换。
3.5 数字证书:把公钥包起来,再加个“身份证”
数字证书本质上就是一个绑定了身份信息的公钥。在密钥审计接口测试里,我建议你重点验证以下三点:
- 证书链完整性:客户端是否校验到根证书?还是只装了中间证书就满了?
- 吊销检查:接口返回的证书是否在 CRL(证书吊销列表)中?你的测试系统有没有模拟吊销场景?
- 有效期:我相信大家都见过凌晨三点接到告警说证书过期了。测试时一定覆盖过期证书的请求。
3.6 密钥生命周期:从出生到消亡的七个阶段
密钥不是一成不变的静态资源。它有自己的生命周期。做接口测试时,每个生命周期节点都可能成为风险点。
你看,密钥从生到死,一共七个阶段。我个人的经验是,接口测试最容易遗漏的是撤销和销毁这两个阶段。多数测试团队会测生成、分发和使用——因为这部分是正常流程。但密钥被撤销后,接口是否应拒绝该密钥发起的请求?密钥被销毁后,历史数据是否还能解密?这些边界场景我建议一定要在自动化测试中覆盖。
3.7 各个阶段的测试对策
| 生命周期阶段 | 测试目标 | 典型用例 | 预期结果 |
|---|---|---|---|
| 生成 | 验证密钥强度与随机性 | 调用生成接口100次,检查重复率 | 无重复,密钥长度≥256位 |
| 分发 | 确认密钥传输通道加密 | 中间人截获分发响应 | 响应体加密,无法明文读取 |
| 使用 | 验证签名/加解密正确性 | 用密钥加密已知明文,比对密文 | 密文与预期一致 |
| 轮换 | 新旧密钥平滑切换 | 触发轮换后,旧密钥请求应失败 | 旧密钥返回401或密钥过期错误 |
| 撤销 | 已撤销密钥立即失效 | 撤销密钥后1秒内发起请求 | 请求被拒绝 |
| 归档 | 历史数据可解密且审计可查 | 用归档密钥解密旧日志 | 解密成功,日志可读 |
| 销毁 | 密钥彻底不可恢复 | 尝试从HSM/内存恢复密钥 | 无残留数据 |
核心原则: 密钥生命周期测试不是一次性工作。我建议你针对每个阶段编写独立的测试用例,并在 CI/CD 流水线中定期执行。特别是密钥轮换和撤销这两个节点,它们是合规审计的必查项。
3.8 一个真实的“密钥惨案”
有一次我接手一个已有项目的安全加固任务。审计接口时发现它们的密钥生命周期只实现了“生成 → 使用 → 销毁”三段。没有轮换,没有撤销,归档就更别提了。
结果呢?
- 一个被怀疑泄露的密钥,因为没有撤销机制,在系统中又苟了三天,期间被外部攻击者成功利用。
- 密钥轮换策略缺失,导致同一个 AES 密钥用了两年多。
所以说,接口测试不只是测功能正确性,更要测生命周期管理的完备性。你想想看,一个只测“使用”阶段而不测“轮换”的项目,能过合规审计吗?
一个小工具: 我个人习惯用openssl rand -hex 32来生成测试用的对称密钥,用openssl genpkey -algorithm RSA -out private.pem -pkeyopt rsa_keygen_bits:2048来生成 RSA 密钥对。测试时保证这些密钥不与生产环境混用,单独维护一套测试专用的密钥池。
3.9 本章小结:测试前你必须回答的三个问题
在做密钥审计接口测试的用例设计之前,我建议你先回答清楚这三个问题:
- 被测接口使用了哪种类型的密钥? 对称?非对称?HMAC?还是证书?
- 该密钥当前处于生命周期的哪个阶段? 是刚生成,还是正在使用,还是已经被归档?
- 你准备测试哪几个阶段? 千万别只测“使用”阶段,轮换、撤销、销毁都要跑一遍。