对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

CSFLE 显式加密

显式加密提供了对安全性的细粒度控制,但代价是在配置集合和为 MongoDB 驱动程序编写代码时增加了复杂性。 通过显式加密,您可以为对数据库执行的每个操作指定如何加密文档中的字段,并在整个应用程序中包含此逻辑。

以下 MongoDB 产品提供显式加密:

  • MongoDB 社区服务器

  • MongoDB Enterprise Advanced

  • MongoDB Atlas

要使用显式加密,您必须在启用 CSFLE 的应用程序中执行以下操作:

要使用显式加密,必须创建一个 ClientEncryption 实例。ClientEncryption 是跨驱动程序和 mongosh 使用的抽象,它封装了密钥保管库集合和显式加密涉及到的 KMS 操作。

要创建 ClientEncryption 实例,您必须指定以下信息:

  • 可以访问您的密钥保管库集合的 MongoClient 实例

  • 密钥保管库集合的命名空间

  • 经过配置,具备您客户主密钥 KMS 托管提供商访问权限的 kmsProviders 对象

有关更多ClientEncryption选项,请参阅CSFLE 的 MongoClient 选项。

要查看显示如何创建 ClientEncryption 实例的代码片段,请参阅本指南的示例部分。

您必须在整个应用程序中更新读写操作,使应用程序在执行读写操作前对字段进行加密。

要加密字段,请使用 ClientEncryption 实例的 encrypt 方法。

要查看显示如何使用 encrypt 方法的代码片段,请参阅本指南的示例部分。

使用显式加密时,您可以手动或自动解密加密字段。

要手动解密字段,请使用 ClientEncryption 实例的 decrypt 方法。

要查看显示如何使用 decrypt 方法的代码片段,请参阅本指南的示例部分。

要自动解密字段,请按如下所示配置 MongoClient 实例:

  • 指定密钥保管库集合

  • 指定 kmsProviders 对象

  • 如果您使用 MongoDB Community Server,请将 bypassAutoEncryption 选项设置为 True

注意

MongoDB Community Server 支持自动解密

虽然自动加密需要 MongoDB Enterprise 或 MongoDB Atlas,但以下 MongoDB 产品也提供自动解密功能:

  • MongoDB 社区服务器

  • MongoDB Enterprise Advanced

  • MongoDB Atlas

要查看演示如何启用自动解密的代码片段,请选择与首选语言对应的标签页:

语言

假设您想在 MongoDB 实例中插入结构如下的文档:

{
"name": "<name of person>",
"age": <age of person>,
"favorite-foods": ["<array of foods>"]
}
1

在此示例中,您使用相同的 MongoClient 实例来访问密钥保管库集合,并读写加密数据。

以下代码片段展示了如何创建 MongoClient 实例:

const autoEncryptionOpts = {
keyVaultNamespace: keyVaultNamespace,
kmsProviders: kmsProviders,
};
const encryptedClient = Mongo(connectionString, autoEncryptionOpts);
2

以下代码片段展示了如何创建 ClientEncryption 实例:

const clientEncryption = encryptedClient.getClientEncryption();
3

您想使用以下算法对文档的字段进行加密:

字段名称
加密算法
BSON 字段类型

name

确定性

字符串

age

无加密

Int

favorite-foods

随机

阵列

以下代码片段显示如何手动加密文档中的字段并将文档插入 MongoDB:

注意

以下示例中的 dataKeyId 变量指的是数据加密密钥(DEK)。要学习;了解如何使用本地密钥提供程序生成 DEK,请参阅快速入门。要学习;了解如何使用特定密钥管理系统创建 DEK,请参阅 CSFLE 教程。

const encName = clientEncryption.encrypt(
dataKeyId,
"Greg",
"AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
);
const encFoods = clientEncryption.encrypt(
dataKeyId,
["Cheese", "Grapes"],
"AEAD_AES_256_CBC_HMAC_SHA_512-Random"
);
db.getSiblingDB(database).getCollection(collection).insertOne({
name: encName,
foods: encFoods,
});
4

以下代码片段说明了如何检索插入的文档,并手动解密加密的字段:

const encNameQuery = clientEncryption.encrypt(
dataKeyId,
"Greg",
"AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
);
let doc = db.getSiblingDB(database).getCollection(collection).findOne({
name: encNameQuery,
});
console.log(doc);
doc.name = clientEncryption.decrypt(doc.name);
doc.foods = clientEncryption.decrypt(doc.foods);
console.log(doc);

MongoDB 支持使用模式验证来强制加密集合中的特定字段。

在配置为强制执行给某些字段加密的 MongoDB 实例上使用显式加密机制执行客户端字段级加密的客户端必须按照 MongoDB 实例上指定的方式对这些字段进行加密。

要了解如何设置服务器端 CSFLE 强制执行,请参阅 CSFLE 服务器端模式执行。

要了解有关密钥保管库集合、数据加密密钥和客户主密钥的更多信息,请参阅加密密钥和密钥保管库。

要了解有关 KMS 提供商和 kmsProviders 对象的详情,请参阅 KMS 提供商。

要查看和下载上述主题的完整可运行代码示例,请选择一种编程语言: