← 中文资源

简体中文版本

用 KMS 做信封加密

为每个对象生成数据密钥并在本地加密,用 KMS 主密钥包裹数据密钥,使轮换无需重新加密全部数据。

阅读英文原文

概述

用一个主密钥直接加密所有数据会让轮换成本高昂,也把主密钥暴露在过多位置。信封加密把工作量交给每对象数据密钥,KMS 只负责生成与解包数据密钥,从而兼顾安全与轮换效率。

关键步骤

  1. 为每个对象向 KMS 申请数据密钥及其包裹形式。
  2. 用数据密钥在本地加密对象,保存密文与包裹后的密钥。
  3. 读取时让 KMS 解包数据密钥并在本地解密。
  4. 轮换主密钥时无需重加密数据,按访问重新包裹即可。

验证

  • 持久化的只有包裹后的数据密钥。
  • 明文数据密钥不在日志或存储中出现。
  • 读取可用解包后的密钥正确解密。
  • 主密钥轮换不要求批量重加密。

注意事项

  • 信封加密依赖 KMS 可用性,没有缓存时其故障会阻塞解密。
  • 它保护静态数据与包裹密钥,不保护处理期间位于内存中的明文。

适用范围

本条目围绕「用 KMS 做信封加密」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。

const { Plaintext, CiphertextBlob } = await kms.generateDataKey({ KeyId, KeySpec: 'AES_256' });
const ciphertext = encrypt(Plaintext, data);
await store.put(id, { ciphertext, wrappedKey: CiphertextBlob });