文档菜单
文档首页
/
MongoDB 手册
/ / / / /

加密模式

本页内容

  • 概述
  • 加密模式
  • encrypt 关键字
  • encryptMetadata 关键字
  • patternProperties 关键字
  • 示例
  • 指定命名空间
  • 指定数据加密密钥
  • 选择加密规则
  • 指定加密规则
  • 查看完整的模式
  • 了解更多信息

在本页中,您可以了解如何创建用于自动客户端字段级加密(CSFLE)的加密模式,以及如何创建用于CSFLE的加密模式的示例快速入门.

加密模式是一个JSON对象,它使用严格的子集JSON Schema Draft 4标准语法以及关键词encryptencryptMetadata来定义加密规则,这些规则指定了您的CSFLE启用客户端如何加密文档。

加密规则是JSON键值对,定义了您的客户端应用程序如何加密您的字段。您必须在加密规则中指定或继承以下信息:

  • 加密您的字段所使用的算法

  • 客户端用于加密您的字段的哪种数据加密密钥(DEK)

  • 您的字段BSON的类型

加密规则必须包含encryptencryptMetadata关键词之一。

有关您可以在加密方案中定义的加密算法的更多信息,请参阅字段和加密类型。

有关数据加密密钥的更多信息,请参阅加密密钥和密钥保管库。

关键字 encrypt 用于定义 BSON 文档中单个字段的加密规则。包含 encrypt 关键字的加密规则具有以下结构

"<field-name-to-encrypt>": {
"encrypt": {
"algorithm": "<encryption algorithm to use>",
"bsonType": "<bson type of field>",
"keyId": [UUID("<_id of your Data Encryption Key>" )]
}
}

关键字 encryptMetadata 用于定义加密规则,这些规则由同级 properties 标签的子元素继承。包含 encryptMetadata 的加密规则具有以下结构

"bsonType": "object",
"encryptMetadata": {
"algorithm": "<encryption algorithm inherited by children of properties field>",
"keyId": [UUID("<_id of your Data Encryption Key>" )]
},
"properties": { <object to inherit encryptMetadata values> }

您可以使用 patternProperties 关键字在加密模式中定义所有字段名的正则表达式匹配的加密规则。这允许您根据单个正则表达式指定多个加密字段,或者仅使用字段名的一部分来指定它们。关键字 patternProperties 替换了加密模式中的 properties

使用以下结构指定带有 patternProperties 的加密规则

"bsonType": "object",
"patternProperties": {
"<regular expression to match>": {
"encrypt": {
"algorithm": "<encryption algorithm to use>",
"bsonType": "<bson type of field>",
"keyId": [UUID("<_id of your Data Encryption Key>" )]
}
}

有关如何使用 patternProperties 的示例,请参阅加密模式 - 使用模式属性进行加密

本例解释了如何在CSFLE快速入门的“为您的文档创建加密模式”步骤中生成加密模式。

在快速入门中,您需要将具有以下结构的文档插入到medicalRecords数据库中的patients集合中

{
"_id": { "$oid": "<_id of your document>" },
"name": "<name of patient>",
"ssn": <integer>,
"bloodType": "<blood type>",
"medicalRecords": [
{ "weight": <integer>, "bloodPressure": "<blood pressure>" }
],
"insurance": {
"provider": "<provider name>",
"policyNumber": <integer>
}
}

在您的加密模式根目录中,指定加密模式应用的命名空间。以下指定将用于加密和解密medicalRecords数据库中patients集合中的文档

{
"medicalRecords.patients": {
<the schema created in the following steps of this example>
}
}

在快速入门中,您使用单个数据加密密钥(DEK)加密文档的所有字段。要配置文档中的所有字段使用单个DEK进行加密和解密,请在加密模式根目录中使用encryptMetadata关键字指定您的DEK的_id,如下所示

{
"medicalRecords.patients": {
"bsonType": "object",
"encryptMetadata": {
"keyId": [UUID("<_id of your Data Encryption Key>" )]
},
"properties": {
<the schema created in the following steps of this example>
}
}
}

您决定使用以下加密算法加密以下字段

字段名称
加密算法
BSON类型
ssn
确定性
Int
bloodType
随机
String
medicalRecords
随机
Array
insurance.policyNumber
确定性
Int

您选择对以下原因使用确定性加密来加密ssninsurance.policyNumber字段

  • 您希望能够对这些字段进行查询。

  • 这些字段中的值具有高基数,因此这些数据不易受到频率分析攻击。

您选择对bloodType字段使用随机加密,以下是一些原因

  • 您不打算对这个字段进行查询。

  • 这个字段中的值具有低基数,如果您使用确定性加密,则它们容易受到频率分析攻击。

您必须对medicalRecords字段使用随机加密,因为CSFLE不支持对类型为array的字段进行确定性加密。

提示

有关支持的和不支持的自动加密操作的更多信息,请参阅自动加密支持的操作。

要使用确定性加密对 ssn 字段进行加密,请在您的加密模式中指定以下内容

"ssn": {
"encrypt": {
"bsonType": "int",
"algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
}
}

要使用随机加密对 bloodType 字段进行加密,请在您的加密模式中指定以下内容

"bloodType": {
"encrypt": {
"bsonType": "string",
"algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random"
}
}

要使用随机加密对 medicalRecords 字段进行加密,请在您的加密模式中指定以下内容

"medicalRecords": {
"encrypt": {
"bsonType": "array",
"algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random"
}
}

要使用确定性加密对 insurance.policyNumber 字段进行加密,请在您的加密模式中指定以下内容

"insurance": {
"bsonType": "object",
"properties": {
"policyNumber": {
"encrypt": {
"bsonType": "int",
"algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
}
}
}
}

快速入门的完整加密模式如下

{
"medicalRecords.patients": {
"bsonType": "object",
"encryptMetadata": {
"keyId": [UUID("<_id of your Data Encryption Key>" )]
},
"properties": {
"insurance": {
"bsonType": "object",
"properties": {
"policyNumber": {
"encrypt": {
"bsonType": "int",
"algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
}
}
}
},
"medicalRecords": {
"encrypt": {
"bsonType": "array",
"algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random"
}
},
"bloodType": {
"encrypt": {
"bsonType": "string",
"algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random"
}
},
"ssn": {
"encrypt": {
"bsonType": "int",
"algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
}
}
}
}
}

要了解更多关于加密模式的信息,请参阅 CSFLE 加密模式

要了解更多关于自动加密的信息,请参阅 自动加密。

要查看快速入门,请参阅 快速入门。

返回

显式加密