第二章:密钥生成策略与合规性要求

密钥生成这件事,我见过太多团队栽跟头了。不是选错算法,就是长度不够,回头审计时被查出非合规项——罚钱事小,数据泄露才真要命。

这一章咱们就把算法选择、密钥长度、合规标准这三件事掰开揉碎讲清楚。准备好了?直接进入正题。

2.1 算法选择:不是越新越好,而是越“合规”越好

选算法,我的第一原则是:看合规清单。FIPS 140-3、PCI DSS、GDPR、GM/T 0054……这些标准里写了什么算法你就用什么算法,别自己发明。

我个人习惯把算法分成三类:

  • 对称算法:AES 是主力。DES 早该退休了,3DES 也在逐步淘汰。
  • 非对称算法:RSA 还能用,但我建议优先上 ECC。SM2 是国标,国内项目必须用它。
  • 哈希算法:SHA-256 起步,SHA-512 更安全。MD5 和 SHA-1 别碰了,审计直接判不合格。
我的避坑经验: 曾经有个客户坚持用 RSA-1024,说够用了。结果第三方审计直接亮红灯——FIPS 186-5 明确要求 RSA 至少 2048 位。改方案多花了两个迭代周期,得不偿失。

2.1.1 对称算法选择清单

算法密钥长度(位)合规标准状态
AES128, 192, 256FIPS 197, ISO 18033-3✅ 强烈推荐
SM4128GM/T 0002, GB/T 32907✅ 国标必选
3DES168NIST SP 800-67 (弃用中)⚠️ 已不推荐
ChaCha20256RFC 8439✅ 移动端常用

2.1.2 非对称算法与哈希算法

非对称算法里,RSA 和 ECC 是两大主力。ECC 同样的安全强度下密钥更短,性能更好。哈希算法呢?我说个原则:输出长度不能短于 256 位。SHA-256、SHA-3-256、SM3 都是好选择。

警告: 别用 RSA-PSS 签名时选了 SHA-1 作为内部哈希——我遇到过有人复制老代码,签名校验全废了。审计时直接列为严重漏洞。

2.2 密钥长度:短一寸,风险长一寸

密钥长度这个话题,说白了就是:抗暴力破解的能力。每增加 1 位,需要的尝试次数翻倍。

我建议记下这张对照表,审计时直接拿出来对:

算法族最低安全长度推荐长度备注
AES128 位256 位128 位可满足 2030 年前大部分场景
RSA2048 位3072 位1024 位已不再安全
ECC224 位256 位P-256 常用,对应 RSA 3072
SM2256 位256 位国标固定 256 位
DSA2048 位2048 位与 RSA 对标

关键点: 密钥长度不是越大越好。AES-256 和 AES-128 性能差 40% 左右,但 128 位对绝大多数场景已经够用。我一般默认用 256 位,因为审计通吃,不用纠结。

2.3 合规标准:审计官不会写在脸上的红线

合规这玩意儿,平时觉得麻烦,出事后才叫真麻烦。我列几个你绕不过去的标准:

  • FIPS 140-3:美国联邦标准,国际项目必看。要求密钥生成使用 NIST SP 800-133 规定的 DRBG。
  • PCI DSS v4.0:支付行业标准。密钥长度、存储、轮换都有硬性规定。
  • GM/T 0054:中国密码行业标准。要求使用国家密码管理局批准的算法(SM2/SM3/SM4)。
  • GDPR & 等保 2.0:数据保护法规。虽然没有直接规定算法,但要求“适当的安全措施”,目前默认不遵守 FIPS 或国标就是违规。

2.3.1 合规检查清单(我自己的审计备忘录)

  1. 算法白名单: 配置里只允许 AES-256, ECC P-256, SHA-256, SM2, SM4, SM3。
  2. 密钥长度校验: 生成代码里加断言,长度不足直接抛异常。
  3. 随机源验证: 必须使用经过认证的 DRBG(如 CTR_DRBG, Hash_DRBG),别用 rand() 或 math.random。
  4. 密钥存储: 私钥必须 HSM 或加密存储,不能明文落盘。
  5. 轮换策略: 密钥有效期,非对称密钥不超过 2 年,对称密钥不超过 1 年(PCI DSS 要求 1 年)。

我曾经踩过的坑: 项目里用了 OpenSSL 的默认随机生成器,没初始化熵源。结果密钥质量不够,硬是通不过 NIST 随机性测试。后来换用硬件随机数发生器才搞定。嗯,这里要注意,随机数质量直接决定密钥是否“真随机”。

2.4 密钥生成策略的完整决策框架

说了这么多,到底怎么下手?我习惯用一个四步框架:

  1. 定场景:是 TDE 数据加密?TLS 证书?还是代码签名?场景决定了算法族。
  2. 查合规:国内项目对照 GM/T 0054,国际项目对照 FIPS 140-3,金融类对照 PCI DSS。
  3. 选算法+长度:按推荐表选,别搞特殊。
  4. 配随机源:优先用 HSM 或操作系统 /dev/urandom,确保熵足够。

下面这张图概括了本章的核心逻辑。你看完它,心里就有谱了。

密钥生成策略与合规决策框架 场景定义 合规标准查询 算法白名单校验 对称算法选择 AES-256 / SM4 非对称算法选择 ECC P-256 / SM2 / RSA-3072 哈希算法选择 SHA-256 / SM3 密钥长度校验(≥ 推荐最小值) 随机数源认证(DRBG / HSM / /dev/urandom) 合规密钥输出

2.5 生成策略的落地检查点

光说理论不行,咱们来点实际的。这部分是我在审计时一定会查的代码级检查。

2.5.1 代码示例:合规的密钥生成(Java 版)

// 合规生成 AES-256 密钥
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256, SecureRandom.getInstanceStrong());
SecretKey key = keyGen.generateKey();

// 注意:SecureRandom.getInstanceStrong() 在 Linux 下会使用 /dev/random
// 如果阻塞,可以改为 SecureRandom.getInstance("NativePRNGNonBlocking");
// 但必须确保认证过的 DRBG

2.5.2 检查清单

  • 算法实例化时是否指定了 Provider?我建议显式指定,避免 JCE 默认 Provider 被篡改。
  • 密钥长度是否在配置里硬编码而不是从外部读取?防止注入。
  • 生成后是否立即对密钥进行完整性校验(比如 HMAC)?
  • 密钥对象是否显式置空?防止内存转储泄露。

小技巧: 你可以在 CI/CD 流水线里加一个密钥合规扫描插件。我曾经写过一个 Jenkins 脚本,自动检查代码中所有 KeyGenerator/KeyPairGenerator 的初始化参数,长度不足就终止构建。省心。

好了,这一章的核心就这些。记住:算法、长度、合规标准——三个点扣成一个闭环,哪个都不能漏。实际项目中,我建议你先把本章的决策框架打印出来贴在工位旁,上手时对照着来,基本不会翻车。