加密模式
在此页面上
Overview
在此页面上,您可以学习;了解如何为自动客户端字段级加密(CSFLE) 创建加密模式,并查看详细说明如何创建 CSFLE 快速入门中使用的加密模式的示例。
加密模式
加密模式是一个JSON 对象,它使用JSON schema 4草案 标准语法 的严格子集 以及关键字encrypt
和encryptMetadata
来定义 加密规则 ,这些规则指定启用了 CSFLE 的客户端应如何加密您的文档。
加密规则是 JSON 键值对,用于定义客户端应用程序如何加密字段。您必须在加密规则中指定或继承以下信息:
用于加密字段的算法
客户端使用哪个数据加密密钥 (DEK) 来加密您的字段
字段的 BSON 类型
加密规则必须包含encrypt
或encryptMetadata
关键字。
要了解有关可在加密模式中定义的加密算法的更多信息,请参阅字段和加密类型。
要学习;了解有关数据加密密钥的更多信息,请参阅加密密钥和密钥保管库。
encrypt 关键字
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 关键字
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
关键字,为名称与正则表达式匹配的所有字段定义加密规则。 这样,您就可以根据单个正则表达式指定多个字段进行加密,或者仅使用字段名称的一部分来指定这些字段。 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
collection中:
{ "_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 类型 |
---|---|---|
| 确定性 | Int |
| 随机 | 字符串 |
| 随机 | 阵列 |
| 确定性 | Int |
选择使用确定性加密来加密ssn
和insurance.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 加密模式
要了解有关自动加密的更多信息,请参阅自动加密。
要查看快速入门,请参阅快速入门。