概述
用一个主密钥直接加密所有数据会让轮换成本高昂,也把主密钥暴露在过多位置。信封加密把工作量交给每对象数据密钥,KMS 只负责生成与解包数据密钥,从而兼顾安全与轮换效率。
关键步骤
- 为每个对象向 KMS 申请数据密钥及其包裹形式。
- 用数据密钥在本地加密对象,保存密文与包裹后的密钥。
- 读取时让 KMS 解包数据密钥并在本地解密。
- 轮换主密钥时无需重加密数据,按访问重新包裹即可。
验证
- 持久化的只有包裹后的数据密钥。
- 明文数据密钥不在日志或存储中出现。
- 读取可用解包后的密钥正确解密。
- 主密钥轮换不要求批量重加密。
注意事项
- 信封加密依赖 KMS 可用性,没有缓存时其故障会阻塞解密。
- 它保护静态数据与包裹密钥,不保护处理期间位于内存中的明文。
适用范围
本条目围绕「用 KMS 做信封加密」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。
const { Plaintext, CiphertextBlob } = await kms.generateDataKey({ KeyId, KeySpec: 'AES_256' });
const ciphertext = encrypt(Plaintext, data);
await store.put(id, { ciphertext, wrappedKey: CiphertextBlob });