对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

正在使用的加密

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

警告

MongoDB 8.2已知问题

mongocryptd 的 8.2.0 版本可能无法在Windows上运行。如果您在启动 mongocryptd 时指定 --logpath NUL 参数,此错误会影响驱动程序的“正在使用的加密” 。

要学习;了解有关此问题及其解决方法的更多信息,请参阅MongoDB8.2发布说明。

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

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

  • 信用卡号码

  • 地址

  • 健康信息

  • 财务信息

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

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

重要

对于配置为使用客户端字段级加密或 Queryable Encryption 进行自动加密的客户端,不支持 $rerank 阶段。包含 $rerank 的管道会失败,并出现类似 Unrecognized pipeline stage name: '$rerank' 的错误。

该限制适用于所有集合,包括没有加密字段的集合,以及在子管道(例如 $unionWith)中使用 $rerank 的情况。

Queryable Encryption (QE) 是一种正在使用的加密功能,可让您对加密字段值运行查询,包括相等、范围、前缀、后缀和子字符串查询。范围查询支持需要 MongoDB Server 8.0 或更高版本。前缀、后缀和子字符串查询支持需要 MongoDB Server 9.0 或更高版本。

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

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

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

提示

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

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

默认情况下,当 Ruby 驱动程序解密文档时,它会将 64 位整数作为 BSON::Int64 值返回,并将符号作为 BSON::Symbol::Raw 值返回。此行为适用于解密文档中的所有字段,包括未加密的字段。

要将这些值作为 Ruby Integer 和 Symbol 值返回,请将 Mongo.csfle_convert_to_ruby_types 选项设置为 true。此选项同时适用于 Queryable Encryption 和 CSFLE。这是一个全局设置,适用于应用程序中的所有客户端。默认值为 false。

以下示例使用配置了 auto_encryption_options 的客户端插入包含 64 位整数的文档。然后,该示例检索 csfle_convert_to_ruby_types 设置为 false,然后设置为 true 的文档:

encrypted_client = Mongo::Client.new( '<connection string>', auto_encryption_options: { key_vault_namespace: '<key vault namespace>', kms_providers: { local: { key: '<local master key>' } } }) collection = encrypted_client[:users]collection.insert_one({ _id: 1, large_number: 2**40 }) Mongo.csfle_convert_to_ruby_types = falseresult = collection.find({ _id: 1 }).firstputs result['large_number'].classputs result['large_number'].value Mongo.csfle_convert_to_ruby_types = trueresult = collection.find({ _id: 1 }).firstputs result['large_number'].classputs result['large_number']
BSON::Int641099511627776Integer1099511627776