Docs 菜单

正在使用的加密

您可以使用C++驾驶员通过一设立称为正在使用的加密的功能来加密特定文档字段。 正在使用的加密允许应用程序在将数据发送到MongoDB之前对数据进行加密,并使用加密字段查询文档。

正在使用的加密可防止未经授权的用户查看发送到MongoDB或位于加密数据库中的明文数据。 要在应用程序中启用正在使用的加密并授权其解密数据,您必须创建只有您的应用程序才能访问权限的加密密钥。 只有有权访问权限加密密钥的应用程序才能访问权限解密的明文数据。 如果攻击者访问权限对数据库的访问权限,他们只能看到加密的密文数据,因为他们无法访问权限加密密钥。

您可以使用正在使用的加密来加密MongoDB文档中包含以下类型敏感数据的字段:

  • 信用卡号码

  • 地址

  • 健康信息

  • 财务信息

  • 任何其他敏感信息或个人身份信息 (PII)

MongoDB 提供以下功能来启用正在使用的加密:

可查询加密是下一代正在使用的加密功能,首先在 MongoDB Server 6.0 版中作为预览功能引入,然后在 MongoDB 7.0 中作为普遍可用 (GA) 功能引入。可查询加密支持在加密字段中搜索是否相等,并对每个值进行唯一加密。

重要

预览功能与 MongoDB 7.0 不兼容

MongoDB 6.0 中 Queryable Encryption 的实现与 MongoDB 7.0 中引入的 GA 版本不兼容。不再支持 Queryable Encryption 预览功能。

要学习;了解有关Queryable Encryption的更多信息,请参阅MongoDB Server手册中的Queryable Encryption

在 MongoDB Server 4.2 版中引入客户端字段级加密 (CSFLE),支持搜索加密字段的相等性。CSFLE 与 Queryable Encryption 的不同之处在于,您可以选择确定性或随机加密算法来加密字段。 使用 CSFLE 时只能查询使用确定性加密算法的加密字段。当使用随机加密算法对 CSFLE 的字段进行加密时,可以解密这些字段,但不能对这些字段进行相等性查询。使用 Queryable Encryption 时,不能指定加密算法,但可以查询所有加密字段。

当您确定性地加密一个值时,相同的输入值会产生相同的输出值。虽然确定性的加密允许您对这些加密字段执行查询,但关联基数较低的加密数据很容易因频率分析而遭遇密码破解。

提示

要了解有关这些概念的更多信息,请参阅以下维基百科条目:

本节介绍如何使用以下机制配置 CSFLE:

自动加密允许您执行加密的写入操作,而无需指定如何加密字段。要启用自动加密,请使用以下方法之一:

  • crypt_shared (推荐):动态库,可读取加密模式以确定要加密和解密的字段。使用此库时,无需生成单独的进程来执行自动加密。

  • mongocryptd:与MongoDB Enterprise Server 预打包的二进制文件,使用指定的自动加密规则来标记要加密的字段。当您创建启用 CSFLE 的客户端时,mongocryptd 会自动生成,但您可以在 options::auto_encryption实例中显式启动二进制文件。

重要

mongocryptd 需要MongoDB Enterprise Server v4.2 或更高版本。

要学习;了解有关配置自动加密的更多信息,请参阅MongoDB Server手册中的安装和配置 CSFLE 库。

您可以使用 schema_map 选项指定自动加密模式。加密模式包含用户指定的规则,用于确定必须加密哪些字段以及如何加密这些字段。

schema_map 选项设置为符合JSON4 schema Draft 标准语法的JSON 文档。此文档必须包含要加密的字段名称以及每个字段名称下的嵌套encrypt 对象,该对象设置要使用的加密选项。

提示

要学习;了解有关加密模式的更多信息,请参阅MongoDB Server手册中的 CSFLE 加密模式。

以下代码显示了指定JSON schema文档的语法:

auto data_key_id = client_encryption.create_data_key("local");
auto json_schema = document{} << "properties" << open_document << "encryptedFieldName" << open_document << "encrypt"
<< open_document << "keyId" << open_array << data_key_id << close_array << "bsonType"
<< "string"
<< "algorithm"
<< "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" << close_document << close_document
<< close_document << "bsonType"
<< "object" << finalize;

要查看使用前面的json_schema 文档配置自动加密模式的完整示例,请参阅驾驶员源代码中的自动 CSFLE示例。

提示

您还可以为服务器端字段级加密指定自动加密模式。要查看完整示例,请参阅驾驶员源代码中的服务器端字段级加密实施示例。

显式加密允许您使用驱动程序的加密库执行加密操作。要使用显式加密,必须在整个应用程序中指定加密逻辑。

以下示例为插入操作配置显式加密,该操作将加密消息插入数据库:

// Configure your MongoDB client's encryption options here
class client_encryption client_encryption(std::move(client_encryption_opts));
auto data_key_id = client_encryption.create_data_key("local");
options::encrypt encrypt_opts{};
encrypt_opts.key_id(data_key_id.view());
encrypt_opts.algorithm(options::encrypt::encryption_algorithm::k_deterministic);
// Explicitly encrypts 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 decrypts a BSON value
auto decrypted_message = client_encryption.decrypt(encrypted_message);
// Inserts the encrypted value into the database
coll.insert_one(make_document(kvp("encryptedField", encrypted_message)));

要查看配置显式加密的完整示例,请参阅驾驶员源代码中的显式加密示例。

您可以配置所有用户都支持的显式加密和自动解密。要配置自动解密而不自动加密,请创建 options::auto_encryption实例并将其 bypass_auto_encryption字段设立为 true。然后,应用这些选项应用于您的客户端。

以下示例创建一个 options::auto_encryption实例来配置具有自动解密功能的显式加密,然后将此选项实例传递给 options::clientauto_encryption_opts字段。这将创建一个配置为使用自动解密的客户端:

options::auto_encryption auto_encrypt_opts{};
auto_encrypt_opts.bypass_auto_encryption(true);
options::client client_opts{};
client_opts.auto_encryption_opts(std::move(auto_encrypt_opts));
class client client_encrypted {uri{}, std::move(client_opts)};

要查看配置显式加密和自动解密的完整示例,请参阅驾驶员源代码中的显式加密自动解密示例。

要学习;了解有关 CSFLE 的更多信息,请参阅MongoDB Server手册中的CSFLE