为什么密钥管理如此重要?

密码学的薄弱环节从来不是算法本身,而是密钥管理。

  • 算法泄露 ≠ 安全失效
  • 密钥泄露 = 安全失效

密钥生命周期

1
生成 → 分发 → 存储 → 使用 → 轮换 → 撤销 → 销毁

1. 密钥生成

密钥长度指南

算法类型 推荐长度 安全强度
RSA 2048-4096 位 112-128 位
ECC P-256/P-384 128-192 位
AES 128/256 位 128/256 位
HMAC 256 位 minimum 256 位

使用 OpenSSL 生成密钥

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# RSA 密钥对
openssl genrsa -out rsakey.pem 2048
openssl rsa -in rsakey.pem -pubout -out rsakey.pub

# ECC 密钥对
openssl ecparam -genkey -name prime256v1 -out eckey.pem

# 对称密钥(AES)
openssl rand -hex 32 > aeskey.hex
# 或生成二进制文件
openssl rand -out aeskey.bin 32

确保随机性

  • 使用操作系统提供的随机源:/dev/urandom
  • 避免使用 rand() 等伪随机函数
  • 在资源受限设备上,确保硬件随机数生成器可用

2. 密钥存储

不安全的存储方式

❌明文文件存储

1
2
# 不要这样做
echo "my-secret-key" > /tmp/key.txt

❌Git 仓库提交

1
2
3
# 不要这样做
git add secret.key
git commit -m "add key"

安全存储策略

方案 1:操作系统密钥环

  • macOS: Keychain
  • Windows: Credential Manager
  • Linux: GNOME Keyring / KDE Wallet

方案 2:环境变量(临时)

1
2
3
4
5
# 导出密钥到环境变量
export ENCRYPTION_KEY=$(cat /secure/path/key)

# 在代码中读取
echo $ENCRYPTION_KEY

⚠️ 注意:环境变量在进程间共享,需谨慎使用。

方案 3:密钥管理服务(推荐)

服务 提供商
AWS KMS Amazon
Azure Key Vault Microsoft
GCP KMS Google
HashiCorp Vault HashiCorp

AWS KMS 示例:

1
2
3
4
5
# 生成数据密钥
aws kms generate-data-key --key-id alias/mykey --key-spec AES_256

# 使用 KMS 解密
aws kms decrypt --ciphertext-blob fileb://encrypted.key --output text --query Plaintext | base64 -d

方案 4:HSM(硬件安全模块)

用于高安全场景:

  • 金融系统
  • CA 私钥
  • 根密钥

3. 密钥轮换

轮换策略

密钥类型 轮换周期 说明
对称加密密钥 90-365 天 根据数据敏感度
传输密钥 24-72 小时 SSL/TLS 会话密钥
HMAC 密钥 180 天 签名密钥
RSA/ECC 私钥 1-2 年 公钥证书绑定

轮换流程

1
2
3
4
1. 生成新密钥
2. 用新密钥加密新数据
3. 保留旧密钥用于解密历史数据
4. 时间窗口后销毁旧密钥

滚动加密示例

1
2
3
4
5
6
7
8
# 生成新密钥
openssl rand -hex 32 > key_new.hex

# 用新密钥加密文件
openssl enc -aes-256-cbc -salt -in secret.txt -out secret_enc.bin -pass file:key_new.hex

# 保留旧密钥用于解密
cp key_old.hex key_old_backup.hex

4. 密钥撤销

证书撤销(CRL/OCSP)

1
2
# 查看证书撤销状态
openssl x509 -noout -text -in cert.pem | grep -A1 "CRL"

密钥泄露后的措施

  1. 立即停用:停止使用泄露密钥
  2. 撤销证书:如果涉及证书,提交撤销请求
  3. 重新生成:生成新密钥对
  4. 通知相关方:更新所有依赖系统

5. 密钥备份

备份策略

  1. 多地存储:不同物理位置
  2. 加密备份:使用主密钥加密备份
  3. 访问控制:限制备份访问权限
  4. 定期恢复测试:验证备份可用性

多人共享密钥( Shamir 分享)

1
2
# 使用 secretscli 或自定义实现
# 将密钥拆分为 N 份,需要 M 份才能恢复

6. 密钥销毁

安全删除

1
2
3
4
5
# 覆盖删除(Linux)
shred -u -z sensitive_keyfile

# 清空内存(代码中)
memset(key_buffer, 0, key_length);

密钥管理自动化

配置示例(HashiCorp Vault)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# vault.hcl
vault " vault.example.com" {
  auth {
    token = "s.xxxxxx"
  }
}

# 数据加密密钥路径
path "kv/data/encryption" {
  policy = "read"
}

最佳实践总结

✅ DO(做)

  • 使用标准化算法和库
  • 密钥长度符合当前安全标准
  • 自动化密钥轮换
  • 记录密钥访问日志
  • 使用环境隔离(开发/测试/生产密钥分离)

❌ DON’T(不做)

  • 硬编码密钥到源码
  • 通过邮件/IM 传输密钥
  • 在日志中记录密钥
  • 多个系统共享同一密钥
  • 使用过期的加密算法

参考来源