字段加密和可查询性
Overview
在本指南中,您可以了解以下 Queryable Encryption 主题:
如何指定加密字段。
创建collection时如何指定加密字段是否可查询。
查询类型以及哪些类型可用于加密字段。
在决定是否启用对加密字段的查询时要考虑哪些因素。
指定加密字段
Queryable Encryption 允许您指定要在 MongoDB 文档中自动加密的字段。
重要
您可以指定文档中的任何字段进行加密,但 _id
字段除外。
要指定用于加密和查询的字段,请定义包含以下属性的 JSON schema:
密钥名称 | 类型 | 必需? |
---|---|---|
| 字符串 | 必需 |
| 字符串 | 必需 |
| 二进制文件 | 必需 |
| 对象 | 可选,除非您希望能够查询该字段,否则请省略。 |
例子
此示例展示了如何创建 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) ,可查询Queryable Encryption使用该密钥来加密字段。 有关 DEK 的更多信息,请参阅加密密钥管理。
指定可查询的加密字段
在您想要在 JSON schema 中使其可查询的字段上包含queries
属性。 这使授权客户端能够使用加密字段发出读取和写入查询。 您可以省略queries
属性,除非您希望能够查询该字段。
例子
以下代码段展示了如何将queries
属性添加到 JSON schema,以使patientId
和patientInfo.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 目前支持none
或equality
查询类型。 作为 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。