Docs 菜单
Docs 主页
/
MongoDB Manual
/ / / / /

自动加密

在此页面上

  • 加密写入和读取的工作原理
  • 加密写操作
  • 加密读取
  • 启用客户端字段级自动加密
  • 服务器端字段级加密实施

使用客户端字段级加密时,MongoDB 支持自动加密读写操作中的字段。 您可以使用 mongosh和官方 MongoDB 驱动程序执行自动加密。 有关支持 CSFLE 的官方兼容驱动程序的完整列表,请参阅驱动程序兼容性CSFLE 兼容性。

下图显示了客户端应用程序和驱动程序如何写入和读取字段级加密数据。

对于写操作,驱动程序会在写入 MongoDB 数据库对字段值加密。

下图显示了客户端应用程序和驱动程序执行写入字段级加密数据的步骤:

显示写入字段级加密数据的数据流的图示

对于读操作,驱动程序会在发出读操作对查询中的字段值加密。

对于返回加密字段的读操作,只有当驱动程序被配置为可访问用于加密这些值的“客户主密钥”(CMK) 和“数据加密密钥”(DEK) 时,驱动程序才会自动解密加密值。

下图显示了客户端应用程序和驱动程序查询和解密字段级加密数据所采取的步骤:

查询和读取字段级加密数据的数据流示意图

如需启用自动加密,请在客户端的 MongoClient 实例中指定自动加密设置。

以下代码片段展示了如何创建在 mongosh 和 MongoDB 驱动程序中启用自动加密的客户端:

var autoEncryptionOpts =
{
"keyVaultNamespace" : "<database>.<collection>",
"kmsProviders" : { ... },
"schemaMap" : { ... }
}
cluster = Mongo(
"<Your Connection String>",
autoEncryptionOpts
);

提示

环境变量

如果可能,请考虑将kmsProviders 中提供的档案定义为环境变量,然后使用 选项将其传递给mongosh --eval。这样可以最大限度地减少凭证泄漏到日志中的可能性。

var clientSettings = MongoClientSettings.FromConnectionString(_connectionString);
var autoEncryptionOptions = new AutoEncryptionOptions(
keyVaultNamespace: keyVaultNamespace,
kmsProviders: kmsProviders,
schemaMap: schemaMap,
extraOptions: extraOptions);
clientSettings.AutoEncryptionOptions = autoEncryptionOptions;
var client = new MongoClient(clientSettings);
autoEncryptionOpts := options.AutoEncryption().
SetKmsProviders(provider.Credentials()).
SetKeyVaultNamespace(keyVaultNamespace).
SetSchemaMap(schemaMap).
SetExtraOptions(extraOptions)
client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri).SetAutoEncryptionOptions(autoEncryptionOpts))
MongoClientSettings clientSettings = MongoClientSettings.builder()
.applyConnectionString(new ConnectionString("mongodb://localhost:27017"))
.autoEncryptionSettings(AutoEncryptionSettings.builder()
.keyVaultNamespace(keyVaultNamespace)
.kmsProviders(kmsProviders)
.schemaMap(schemaMap)
.extraOptions(extraOptions)
.build())
.build();
MongoClient mongoClient = MongoClients.create(clientSettings);
const secureClient = new MongoClient(connectionString, {
useNewUrlParser: true,
useUnifiedTopology: true,
monitorCommands: true,
autoEncryption: {
keyVaultNamespace,
kmsProviders,
schemaMap: patientSchema,
extraOptions: extraOptions,
},
});
fle_opts = AutoEncryptionOpts(
kms_providers,
key_vault_namespace,
schema_map=patient_schema,
**extra_options
)
client = MongoClient(connection_string, auto_encryption_opts=fle_opts)

有关特定于 CSFLE 的 MongoClient 设置的更多信息,请参阅特定于 CSFLE 的 MongoClient 选项。

MongoDB 支持使用模式验证来实施集合中特定字段的加密。执行自动客户端字段级加密的客户端具有特定行为,具体取决于数据库连接配置:

  • 如果连接的 autoEncryptionOpts schemaMap 对象包含指定集合的密钥,客户端将使用该对象执行字段级自动加密,并忽略远程模式。至少本地规则必须对远程模式标记为需要加密的字段进行加密。

  • 如果连接的 autoEncryptionOpts schemaMap 对象包含指定集合的密钥,客户端会下载该集合的服务器端远程模式,然后用于执行字段级自动加密。

    重要

    行为注意事项

    autoEncryptionOpts 不包含指定集合的密钥时:

    • 客户端相信服务器具有适用于自动字段级加密的有效模式。

    • 客户端仅使用远程模式执行自动 CSFLE。客户端不会实施该模式中指定的任何其他验证规则。

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

后退

基础知识