使用 AWS KMS 和 AWS CloudHSM 的字段级加密

Field level encryption using AWS KMS and AWS CloudHSM

需要为应用程序实现额外的安全级别。假设有一个 table 有 10'000'000 个用户。敏感字段是 user.first_name 和 user.last_name。我们需要在将数据存储到数据库之前对其进行加密,然后在应用程序级别解密以在 UI 上显示它。

据我所知,使用 KMS 的推荐方法是:

写部分

阅读部分

我有一组问题需要澄清:

  1. 为每个用户使用新的数据密钥是否有意义?
  2. 10'000'000 个用户意味着 10'000'000 个不同的数据密钥,存储它们并从进行解密的机器访问它们的最佳做法是什么?
  3. 可以为整个用户设置一个数据密钥吗table?
  4. 在本地计算机上安全存储单个密钥的最佳做法是什么?
  5. 数据密钥不小心丢失了怎么办?有恢复程序吗?

要实施的确切解决方案应根据组织政策和监管需求来决定。但是,以下几点有望帮助您制定解决方案:

  1. 您可以使用伪随机数生成器为每个字段创建单独的数据键。数据密钥将用于加密原始数据,然后数据密钥本身将使用来自 KMS 的通用 "Customer Master Key" 加密。然后加密数据密钥将与加密数据(名字和姓氏,在您的情况下)一起存储。
  2. 在解密过程中,加密数据密钥(与加密数据一起存储)将首先使用来自 KMS 的主密钥进行解密,然后使用数据密钥对数据进行解密
  3. KMS 可以配置为每年自动轮换主密钥。但是,KMS 会跟踪旧密钥,以便将来即使在轮换主密钥后也可以解密使用旧密钥完成的加密
  4. KMS 中的主密钥将跨多个可用区复制,因此具有高可用性
  5. 如果您有更严格的安全要求,您可以考虑将密钥存储在不与其他 AWS 客户共享的专用硬件中的 CloudHSM
  6. 您还可以使用由 CloudHSM 支持的 KMS 自定义密钥存储。但是,在这种情况下,自动密钥轮换将不可用