为 Mongo 客户端字段级加密 (CSFLE) 生成单个数据密钥

问题描述

我将提到的第二个示例 here 用于客户端字段级加密,并且它按预期工作。我创建了一个 Mongo 客户端 bean 并一直使用它,直到我的应用程序停止。

我想知道是否有更好的方法来做以下事情并且几乎没有怀疑:

  1. 每次重新启动服务器时都会运行以下命令:
BsonBinary dataKeyId = clientEncryption.createDataKey("local",new DataKeyOptions());

这每次都会生成一个新密钥并插入我的密钥保管库集合中。我很好奇是否有办法通过获取旧密钥来优化空间来使用旧密钥本身。这两种方法在安全性方面有什么优势吗?

  1. 如果我使用 AWS KMS,我的 mongo 客户端是否会为每次获取/更新调用调用密钥库收集和 KMS?

  2. 如果我启用 AWS KMS 密钥轮换,密钥轮换会在解密旧数据时导致问题吗?

提前致谢。

解决方法

Ruby 驱动程序提供了可能有用的示例here

生成本地密钥后,您可以使用任何您希望的机制存储它,并在以后重复使用。密钥不应存储在数据库中(因为加密是在客户端完成的)因此驱动程序不提供存储它的设施,这取决于您。

通常的用法大概是:

  • 一次使用主密钥生成本地密钥
  • 为您的应用程序提供本地密钥以进行操作(加密和解密)

这样您的应用程序将根本无法访问主密钥(因此将无法任意生成本地密钥)。