Docs 菜单
Docs 主页
/ /

客户端字段级加密 (Client-Side Field Level Encryption)

MongoDB新增功能4.2 除了其他MongoDB加密功能外,客户端字段级加密(CSFLE) 还允许管理员和开发者加密特定数据字段。

使用 CSFLE,开发者可以加密客户端字段,而无需任何服务器端配置或指令。 客户端字段级加密支持应用程序必须保证包括服务器管理员在内的未经授权方无法读取加密数据的工作负载。

有关 CSFLE 的概述,请阅读手册中的MongoDB官方文档。

客户端字段级加密依赖于名为 libmongocrypt 的C库来完成繁重的加密工作。此依赖项由C驱动程序托管。只要 C 驱动程序安装版本为 1.16.0 或更高版本,并且已使用客户端字段级加密支持进行编译,则应在内部托管此依赖项。有关详细信息,请参阅C驱动程序的使用客户端字段级加密

自动 CSFLE 依赖于在驱动程序运行时作为守护进程运行的名为mongocryptd的新二进制文件。 此二进制文件仅适用于 MongoDB Enterprise。

mongocryptd 可以与驱动程序分开启动,也可以在使用加密时自动生成。

要单独运行 mongocryptd,请将mongocryptdBypassSpawn标志传递给客户端的自动加密选项:

auto mongocryptd_options = make_document(kvp("mongocryptdBypassSpawn", true));
options::auto_encryption auto_encrypt_opts{};
auto_encrypt_opts.extra_options({mongocryptd_options.view()});

如果 mongocryptd 二进制文件位于当前路径上,则驱动程序将能够在没有任何自定义标志的情况下生成它。 但是,如果 mongocryptd 二进制文件位于不同路径上,请使用mongocryptdSpawnPath选项设置路径:

auto mongocryptd_options = make_document(kvp("mongocryptdSpawnPath", "path/to/mongocryptd"));
options::auto_encryption auto_encrypt_opts{};
auto_encrypt_opts.extra_options({mongocryptd_options.view()});

通过创建mongocxx::client来启用自动客户端字段级加密,并将auto_encryption_opts选项设置为mongocxx::options::auto_encryption的实例。 以下示例展示了如何使用mongocxx::client_encryption类设置自动客户端字段级加密,以创建新的加密数据密钥。

注意

客户端字段级自动加密需要 MongoDB 4.2企业版或 MongoDB 4.2 Atlas 集群。 服务器的社区版本支持自动解密以及显式客户端字段级加密。

以下示例演示如何通过 schema_map 选项指定自动加密规则。 自动加密规则使用JSON schema 语法的严格子集来表示。

与依赖从服务器获取的 JSON schemas 相比,提供schema_map提供了更高的安全性。 它可以防止恶意服务器宣传虚假 JSON schema,这种情况可能会诱骗客户端发送应加密的未加密数据。

schema_map中提供的 JSON schema仅适用于配置自动客户端字段级加密。 JSON schema中的其他验证规则不会由驱动程序执行,并会导致错误。

//
// The schema map has the following form:
//
// {
// "test.coll" : {
// "bsonType" : "object",
// "properties" : {
// "encryptedFieldName" : {
// "encrypt" : {
// "keyId" : [ <datakey as UUID> ],
// "bsonType" : "string",
// "algorithm" : <algorithm>
// }
// }
// }
// }
// }
//

有关如何设立自动加密的JSON schema的完整示例,请参阅examples/mongocxx/automatic_client_side_field_level_encryption.cpp。

MongoDB 4.2服务器支持使用模式验证来强制对集合中的特定字段进行加密。 此模式验证将防止应用程序为任何标有"encrypt" JSON schema关键字的字段插入未加密的值。

可以使用mongocxx::client_encryption设立自动客户端字段级加密,创建新的加密数据密钥,并使用自动加密JSON schema事务语法创建集合。

// Please see the linked example below for full json_schema construction.
bsoncxx::document::value json_schema{};
// Create the collection with the encryption JSON Schema.
auto cmd = document{} << "create"
<< "coll"
<< "validator" << open_document
<< "$jsonSchema" << json_schema.view()
<< close_document << finalize;
db.run_command(cmd.view());

有关在服务器上设置加密强制执行的完整示例,请参阅examples/mongocxx/server_side_field_level_encryption_enforcement.cpp。

显式加密是MongoDB Community的一项功能,不使用 mongocryptd 进程。 显式加密由mongocxx::client_encryption类提供。

// Explicitly encrypt a BSON value.
auto to_encrypt = bsoncxx::types::bson_value::make_value("secret message");
auto encrypted_message = client_encryption.encrypt(to_encrypt, encrypt_opts);
// Explicitly decrypt a BSON value.
auto decrypted_message = client_encryption.decrypt(encrypted_message);

有关使用显式加密和解密的完整示例,请参阅examples/mongocxx/explicit_encryption.cpp

虽然自动加密需要 MongoDB 4.2企业版或 MongoDB 4.2 Atlas 集群,支持所有用户自动解密。 要配置自动解密而不自动加密,请在options::auto_encryption类中设置bypass_auto_encryption=True

options::auto_encryption auto_encrypt_opts{};
auto_encrypt_opts.bypass_auto_encryption(true);
// Please see full example for complete options construction.
// Create a client with automatic decryption enabled, but automatic encryption bypassed.
options::client client_opts{};
client_opts.auto_encryption_opts(std::move(auto_encrypt_opts));
class client client_encrypted {uri{}, std::move(client_opts)};

有关使用显式加密和自动解密的示例,请参阅examples/mongocxx/explicit_encryption_auto_decryption.cpp。

后退

配置

在此页面上