Docs 菜单
Docs 主页
/
MongoDB Manual
/ / / / /

字段加密和可查询性

在此页面上

  • Overview
  • 指定加密字段
  • 例子
  • 指定可查询的加密字段
  • 例子
  • 启用可查询加密
  • 查询类型
  • 启用查询时的注意事项

在本指南中,您可以了解以下 Queryable Encryption 主题:

  • 如何指定加密字段。

  • 创建collection时如何指定加密字段是否可查询。

  • 查询类型以及哪些类型可用于加密字段。

  • 在决定是否启用对加密字段的查询时要考虑哪些因素。

Queryable Encryption 允许您指定要在 MongoDB 文档中自动加密的字段。

重要

您可以指定文档中的任何字段进行加密,但 _id字段除外。

要指定用于加密和查询的字段,请定义包含以下属性的 JSON schema:

密钥名称
类型
必需?
path
字符串
必需
bsonType
字符串
必需
keyId
二进制文件
必需
queries
对象
可选,除非您希望能够查询该字段,否则请省略。

此示例展示了如何创建 JSON schema,以指定 Queryable Encryption 功能应自动加密的字段。

考虑以下包含个人身份信息 (PII)、信用卡信息和敏感医疗信息的文档:

{
"firstName": "Jon",
"lastName": "Snow",
"patientId": 12345187,
"address": "123 Cherry Ave",
"medications": [
"Adderal",
"Lipitor"
],
"patientInfo": {
"ssn": "921-12-1234",
"billing": {
"type": "visa",
"number": "1234-1234-1234-1234"
}
}
}

为确保 PII 和敏感医疗信息的安全,请创建一个 JSON schema,将 Queryable Encryption 配置为自动加密这些字段。以下示例 JSON schema显示了如何指定要加密的字段:

const encryptedFieldsObject = {
fields: [
{
path: "patientId",
keyId: "<unique data encryption key>",
bsonType: "int"
},
{
path: "patientInfo.ssn",
keyId: "<unique data encryption key>",
bsonType: "string"
},
{
path: "medications",
keyId: "<unique data encryption key>",
bsonType: "array"
},
{
path: "patientInfo.billing",
keyId: "<unique data encryption key>",
bsonType: "object"
},
]
}

请注意, keyId字段需要唯一的数据加密密钥 (DEK),可查询加密使用该密钥来加密字段。有关 DEK 的更多信息,请参阅加密密钥管理。

在您想要在 JSON schema 中使其可查询的字段上包含queries属性。 这使授权客户端能够使用加密字段发出读取和写入查询。 您可以省略queries属性,除非您希望能够查询该字段。

以下代码段展示了如何将queries属性添加到 JSON schema,以使patientIdpatientInfo.ssn字段可查询。

const encryptedFieldsObject = {
fields: [
{
path: "patientId",
keyId: "<unique data encryption key>",
bsonType: "int",
queries: { queryType: "equality" }
},
{
path: "patientInfo.ssn",
keyId: "<unique data encryption key>",
bsonType: "string",
queries: { queryType: "equality" }
},
{
path: "medications",
keyId: "<unique data encryption key>",
bsonType: "array"
},
{
path: "patientInfo.billing",
keyId: "<unique data encryption key>",
bsonType: "object"
},
]
}

有关查询类型的更多信息,请参阅查询类型。

您可以通过以下方式对 JSON schema中指定的字段启用 Queryable Encryption:

  • encryptedFieldsObject常量表示的 JSON schema传递给应用程序用于创建collection的客户端,如以下代码片段所示:

const client = new MongoClient(uri, {
autoEncryption: {
keyVaultNameSpace: "<your keyvault namespace>",
kmsProviders: "<your kms provider>",
extraOptions: {
cryptSharedLibPath: "<path to FLE Shared Library>"
},
encryptedFieldsMap: {
"<databaseName.collectionName>": { encryptedFieldsObject }
}
}
...
await client.db("<database name>").createCollection("<collection name>");
}

注意

在创建collection之前启用Queryable Encryption非常重要。在创建collection后启用 Queryable Encryption 不会加密该collection中已有文档的字段。

有关 autoEncryption 配置选项的更多信息,请参阅 MongoClient 的 Queryable Encryption 选项一节。

  • 将加密的字段对象传递给调用以创建新的collection,如以下代码片段所示:

await encryptedDB.createCollection("<collection name>", {
encryptedFields: encryptedFieldsObject
});

提示

For the highest level of security, specify the encrypted fields both when creating the collection, and when creating a client to access the collection. 这样可以确保如果服务器的安全性遭到破坏,信息仍然通过客户端进行加密。

重要

MongoDB 建议在使用 Queryable Encryption 时显式创建collection,而不是通过插入操作隐式创建collection。使用createCollection()创建collection时,该操作会在加密字段上创建索引。如果没有索引,对加密字段的查询可能会运行缓慢。

Queryable Encryption 允许您通过将查询类型传递给加密字段对象中的queries选项来指定要启用查询的字段。

Queryable Encryption 目前支持noneequality查询类型。 作为 MongoDB 6.0 中 Queryable Encryption 的一部分引入的新框架旨在容纳其他表达性搜索,例如范围和字符串操作符。

查询类型none表示数据将被加密,但不可查询。 无法对查询类型为none的加密数据运行查询。 如果在以下位置运行查询,则会返回加密数据:

  • 非加密字段

  • 位于同一集合中查询类型为equality的字段,并在客户端解密。

重要

无指定查询类型

如果未显式指定查询类型,则查询类型将默认为none ,并且无法查询数据。

equality查询类型允许您使用以下表达式查询加密字段:

注意

即使使用支持的查询操作符,将加密字段与null或表达式进行比较的查询也会导致错误。

当操作将加密字段与以下任何BSON类型进行比较时,使用equality查询类型的 Queryable Encryption 不支持对该字段进行读取或写入操作:

  • double

  • decimal128

  • object

  • array

  • javascriptWithScope (已弃用)

使用“可查询加密”时,可以选择是否将加密字段设置为可查询。 如果您不需要执行读取操作或需要读取加密字段的写入操作,您可以决定不启用对该字段的查询。 您仍然可以通过查询其他可查询或未加密的字段来检索整个文档。

当您将加密字段设置为可查询时,Queryable Encryption 会为每个加密字段创建一个索引,这会使该字段的写入操作花费更长时间。 当写入操作更新索引字段时,MongoDB 也会更新相关索引。

对加密字段启用查询时,您的集合需要更多存储空间。 这些集合名称以enxcol_.开头,包含重要的加密元数据。

警告

请勿修改以enxcol_.开头的collection。

后退

Fundamentals