文档菜单
文档首页
/ / /
C++ 驱动
/

客户端字段级加密

本页内容

  • 客户端字段级加密
  • 安装
  • 示例

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

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

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

客户端字段级加密依赖于一个名为 libmongocrypt 的 C 库来执行加密工作。这个依赖由 C 驱动程序管理。只要 C 驱动程序的安装版本为 1.16.0 或更高版本,并且已经编译了客户端字段级加密支持,这个依赖应该由内部管理。请参阅 C 驱动程序的 使用客户端字段级加密 以获取更多信息。

自动 CSFLE 依赖于一个名为 mongocryptd 的新二进制文件,作为守护进程在驱动程序运行时运行。此二进制文件仅在 MongoDB 企业版中可用。

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()});

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

注意

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

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

提供 schema_map 比依赖于从服务器获得的 JSON Schema 提供更多的安全性。它可以防止恶意服务器广告虚假 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>
// }
// }
// }
// }
// }
//

请参阅 examples/mongocxx/automatic_client_side_field_level_encryption.cpp 以查看如何为自动加密设置 JSON 架构的完整示例。

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

可以使用 mongocxx::client_encryption 设置自动客户端字段级加密,以创建一个新的加密数据密钥,并使用 自动加密 JSON 架构语法。

// 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社区的一个功能,不使用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以了解使用显式加密和自动解密示例。

返回

使用中加密