自动加密
使用客户端字段级加密时,MongoDB 支持自动加密读写操作中的字段。 您可以使用 mongosh
和官方 MongoDB 驱动程序执行自动加密。 有关支持 CSFLE 的官方兼容驱动程序的完整列表,请参阅驱动程序兼容性CSFLE 兼容性。
加密写入和读取的工作原理
下图显示了客户端应用程序和驱动程序如何写入和读取字段级加密数据。
加密写操作
对于写操作,驱动程序会在写入 MongoDB 数据库前对字段值加密。
下图显示了客户端应用程序和驱动程序执行写入字段级加密数据的步骤:
加密读取
对于读操作,驱动程序会在发出读操作前对查询中的字段值加密。
对于返回加密字段的读操作,只有当驱动程序被配置为可访问用于加密这些值的“客户主密钥”(CMK) 和“数据加密密钥”(DEK) 时,驱动程序才会自动解密加密值。
下图显示了客户端应用程序和驱动程序查询和解密字段级加密数据所采取的步骤:
启用客户端字段级自动加密
如需启用自动加密,请在客户端的 MongoClient
实例中指定自动加密设置。
以下代码片段展示了如何创建在 mongosh
和 MongoDB 驱动程序中启用自动加密的客户端:
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 服务器端模式执行。