自动加密
使用 客户端字段级加密时, MongoDB支持自动加密写入操作中的字段。 您可以使用 mongosh
和官方MongoDB驱动程序执行自动加密。 有关支持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, { 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
对象不包含指定集合的密钥,客户端会下载该集合的服务器端远程模式,然后用于执行字段级自动加密。重要
行为注意事项
MongoDB 使用模式验证来实施集合中特定字段的加密。如果没有客户端模式,客户端将下载集合的服务器端模式来确定要加密哪些字段。如要避免此问题,请使用客户端模式验证。
由于 CSFLE 和Queryable Encryption不提供验证模式完整性的机制,因此依赖服务器端模式意味着相信服务器的模式没有被篡改。 如果攻击者破坏了服务器,他们就可以修改模式,使以前加密的字段不再被标记为加密。 这会导致客户端发送该字段的明文值。
要了解如何设置服务器端 CSFLE 强制执行,请参阅 CSFLE 服务器端模式执行。