使用 AWS KMS 实现信封加密
概述
信封加密(Envelope Encryption)是一种用数据加密密钥(DEK,Data Encryption Key)加密数据,再用 AWS KMS 管理的主密钥(KEK,Key Encryption Key)加密 DEK 的策略。该方法允许在本地加密大量数据,同时将主密钥安全保存在 AWS 管理的硬件安全模块(HSM,Hardware Security Module)中。本技能涵盖使用 AWS KMS GenerateDataKey API 实现信封加密。
目标
- 理解信封加密模式及其优势
- 使用 AWS KMS GenerateDataKey 生成数据加密密钥
- 使用 DEK 在本地加密/解密数据
- 将加密的 DEK 与密文一起存储
- 实现密钥缓存以减少 KMS API 调用
- 通过自动重新加密处理密钥轮换
- 实现多区域加密以实现灾难恢复
核心概念
信封加密流程
- 调用
kms:GenerateDataKey获取明文 DEK + 加密 DEK - 使用明文 DEK 在本地加密数据(AES-256-GCM)
- 将加密 DEK 与密文一起存储
- 从内存中丢弃明文 DEK
- 解密时:对加密 DEK 调用
kms:Decrypt,然后解密数据
相比直接 KMS 加密的优势
| 方面 | 直接 KMS | 信封加密 |
|---|---|---|
| 最大数据量 | 4 KB | 无限制 |
| 延迟 | 每次操作需网络往返 | 本地加密 |
| 费用 | $0.03/10,000 请求 | 更少的 KMS 请求 |
| 离线支持 | 不可能 | 是(使用缓存 DEK) |
KMS 密钥类型
- AWS 托管:AWS 创建和管理(
aws/s3、aws/ebs) - 客户托管:您创建和管理策略
- 自定义密钥存储:由 CloudHSM 集群支持
安全注意事项
- 永远不要存储明文 DEK;只保留加密 DEK
- 使用密钥策略限制可以调用 GenerateDataKey 和 Decrypt 的对象
- 为所有 KMS API 调用启用 AWS CloudTrail 日志记录
- 实现密钥轮换(CMK 每年自动轮换)
- 使用加密上下文实现认证加密元数据
- 使用指数退避处理 KMS 节流
验证标准
- GenerateDataKey 返回明文和加密 DEK
- 使用明文 DEK 通过 AES-256-GCM 正确加密数据
- 加密 DEK 可通过 KMS Decrypt API 解密
- 解密后的 DEK 能恢复原始数据
- 明文 DEK 使用后从内存中清除
- 解密时验证加密上下文
- 密钥轮换用新主密钥重新加密 DEK