# Implementing Envelope Encryption With AWS Kms

> 信封加密（Envelope Encryption）是一种用数据加密密钥（DEK）加密数据，再用 AWS KMS 管理的主密钥（KEK）加密 DEK 的策略。该方法允许在本地加密大量数据，同时将主密钥安全保存在 AWS 管理的硬件安全模块（HSM）中。

- Skill: `killvxk/implementing-envelope-encryption-with-aws-kms` (Agent Skill, multi-file: 8 files)
- Install (CLI): `npx skillmds@latest add killvxk/implementing-envelope-encryption-with-aws-kms`
- Raw SKILL.md: https://api.skillmd.com/api/skills/killvxk/implementing-envelope-encryption-with-aws-kms/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- License: Apache-2.0
- Author: killvxk (https://skillmd.com/u/killvxk)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/killvxk/implementing-envelope-encryption-with-aws-kms

---

# 使用 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 调用
- 通过自动重新加密处理密钥轮换
- 实现多区域加密以实现灾难恢复

## 核心概念

### 信封加密流程

1. 调用 `kms:GenerateDataKey` 获取明文 DEK + 加密 DEK
2. 使用明文 DEK 在本地加密数据（AES-256-GCM）
3. 将加密 DEK 与密文一起存储
4. 从内存中丢弃明文 DEK
5. 解密时：对加密 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

