Overview
En esta página, puedes aprender a crear un esquema de cifrado para el Cifrado Automático a Nivel de Campo del Lado del Cliente (CSFLE), así como ver un ejemplo detallando cómo crear el esquema de cifrado utilizado en el CSFLE Inicio rápido.
Esquemas de cifrado
Un esquema de cifrado es un objeto JSON que utiliza un subconjunto estricto de
Borrador de esquema JSON 4 sintaxis estándar
junto con las palabras clave encrypt y encryptMetadata para definir las reglas de cifrado que especifican cómo tu cliente habilitado con CSFLE debe cifrar tus documentos.
Las reglas de cifrado son pares clave-valor JSON que definen cómo tu aplicación cliente cifra tus campos. Debes especificar o heredar la siguiente información en una regla de cifrado:
El algoritmo utilizado para cifrar tu campo
Qué Clave de cifrado de datos (DEK) usa su cliente para cifrar su campo
El tipo BSON de tu campo
Las reglas de cifrado deben contener ya sea la palabra clave encrypt o encryptMetadata.
Para saber más sobre los algoritmos de cifrado que puedes definir en tu esquema de cifrado, consulta Campos y tipos de cifrado.
Para obtener más información sobre las claves de cifrado de datos, consulte Claves de cifrado y bóvedas de claves.
palabra clave cifrar
La palabra clave encrypt define una regla de cifrado para un solo campo en un documento BSON. Las reglas de cifrado que contienen la palabra clave encrypt tienen la siguiente estructura:
"<field-name-to-encrypt>": { "encrypt": { "algorithm": "<encryption algorithm to use>", "bsonType": "<bson type of field>", "keyId": [UUID("<_id of your Data Encryption Key>" )] } }
encryptMetadata Keyword
La palabra clave encryptMetadata define las reglas de cifrado que los elementos secundarios de la etiqueta hermana properties heredan. Las reglas de cifrado que contienen encryptMetadata tienen la siguiente estructura:
"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> }
Palabra clave de patternProperties
Puede usar la palabra clave patternProperties en su esquema de cifrado para definir reglas de cifrado para todos los campos cuyos nombres coincidan con una expresión regular. Esto le permite especificar varios campos para el cifrado basándose en una sola expresión regular o especificarlos usando solo una parte del nombre del campo. La palabra clave patternProperties reemplaza a properties en su esquema de cifrado.
Especifique reglas de cifrado con patternProperties utilizando la siguiente estructura:
"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>" )] } }
Para ver un ejemplo de cómo usar, consulte patternProperties Esquema de cifrado: Cifrar con propiedades de patrón
Ejemplo
Este ejemplo explica cómo generar el esquema de cifrado utilizado en el paso Crear un esquema de cifrado para sus documentos del Inicio rápido de CSFLE.
En el Inicio rápido, inserte documentos con la siguiente estructura en la colección patients de la base de datos medicalRecords:
{ "_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> } }
Especifique el espacio de nombres
En la raíz de tu esquema de cifrado, especifica el namespace al que se aplica tu esquema de cifrado. Especifique lo siguiente para cifrar y descifrar documentos en la colección patients de la base de datos medicalRecords:
{ "medicalRecords.patients": { <the schema created in the following steps of this example> } }
Especifica la llave de cifrado de datos
En el inicio rápido, encriptas todos los campos de tu documento con una única clave de cifrado de datos (DEK). Para configurar todos los campos en tus documentos para que utilicen un solo DEK para cifrado y desencriptación, especifica el _id de tu DEK con la palabra clave encryptMetadata en la raíz de tu esquema de cifrado como sigue:
{ "medicalRecords.patients": { "bsonType": "object", "encryptMetadata": { "keyId": [ UUID( "<_id of your Data Encryption Key>" ) ] }, "properties": { <the schema created in the following steps of this example> } } }
Elija reglas de cifrado
Decide cifrar los siguientes campos con los siguientes algoritmos de cifrado:
Nombre de campo | Algoritmo de cifrado | Tipo BSON |
|---|---|---|
| Determinista | Int |
| Aleatorio | String |
| Aleatorio | Arreglo |
| Determinista | Int |
Elige encriptar los campos ssn y insurance.policyNumber con cifrado determinista por las siguientes razones:
Desea poder realizar consultas sobre estos campos.
Los valores de estos campos tienen una alta cardinalidad, por lo que estos datos no son susceptibles a un ataque de análisis de frecuencia.
Decides cifrar el campo bloodType con cifrado aleatorio por las siguientes razones:
No tienes previsto query en este campo.
Los valores en este campo tienen baja cardinalidad, lo que los hace susceptibles a un ataque de análisis de frecuencia si los cifras de forma determinista.
Debe cifrar el campo medicalRecords con cifrado aleatorio ya que CSFLE no admite el cifrado determinista de campos de tipo array.
Tip
Para obtener más información sobre las operaciones de encriptación automática compatibles y no compatibles, consulta Operaciones compatibles para encriptación automática.
Especificar reglas de cifrado
Para cifrar el campo ssn con cifrado determinista, especifique lo siguiente en su esquema de cifrado:
"ssn": { "encrypt": { "bsonType": "int", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }
Para encriptar el campo bloodType con cifrado aleatorio, especifícalo en tu esquema de cifrado:
"bloodType": { "encrypt": { "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }
Para encriptar el campo medicalRecords con cifrado aleatorio, especifícalo en tu esquema de cifrado:
"medicalRecords": { "encrypt": { "bsonType": "array", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }
Para cifrar el campo insurance.policyNumber con cifrado determinista, especifique lo siguiente en su esquema de cifrado:
"insurance": { "bsonType": "object", "properties": { "policyNumber": { "encrypt": { "bsonType": "int", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } } }
Ver el esquema completo
El esquema de cifrado completo para el Quick Start es el siguiente:
{ "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" } } } } }
Obtén más información
Para obtener más información sobre los esquemas de cifrado, consulte Esquemas de cifrado CSFLE
Para obtener más información sobre el cifrado automático, consulte Cifrado automático.
Para ver la Guía de inicio rápido, consulte la Guía de inicio rápido de CSFLE.