Docs Menu
Docs Home
/ /
/ / /

Esquemas de cifrado

En esta página, puede aprender cómo crear un esquema de cifrado para el cifrado a nivel de campo del lado del cliente (CSFLE) automático, así como ver un ejemplo que detalla cómo crear el esquema de cifrado utilizado en el Inicio rápido de CSFLE.

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 su cliente habilitado para CSFLE debe cifrar sus 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 su campo

  • ¿Qué clave de cifrado de datos (DEK) utiliza su cliente para cifrar su campo?

  • El tipo BSON de su campo

Las reglas de cifrado deben contener la palabra clave encrypt o encryptMetadata.

Para obtener más información sobre los algoritmos de cifrado que puede definir en su esquema de cifrado, consulte Campos y tipos de cifrado.

Para obtener más información sobre las claves de cifrado de datos, consulte Claves y bóvedas de claves.

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>" )]
}
}

La palabra clave encryptMetadata define las reglas de cifrado que heredan los elementos secundarios de la etiqueta properties. 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> }

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

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>
}
}

En la raíz de su esquema de cifrado, especifique el espacio de nombres al que se aplica. 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>
}
}

En el Inicio rápido, se cifran todos los campos del documento con una única clave de cifrado de datos (DEK). Para configurar todos los campos de los documentos para que utilicen una única DEK para el cifrado y el descifrado, especifique el _id de la DEK con la palabra clave encryptMetadata en la raíz del esquema de cifrado, como se indica a continuación:

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

Decide cifrar los siguientes campos con los siguientes algoritmos de cifrado:

Nombre de campo
Algoritmo de cifrado
Tipo BSON

ssn

Determinista

Int

bloodType

Azar

String

medicalRecords

Azar

Arreglo

insurance.policyNumber

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.

Elige cifrar el campo bloodType con cifrado aleatorio por las siguientes razones:

  • No tienes previsto realizar consultas en este campo.

  • Los valores de este campo tienen baja cardinalidad, lo que los hace susceptibles a un ataque de análisis de frecuencia si los cifra 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 cifrado automático admitidas y no admitidas,consulte Operaciones admitidas para cifrado automático.

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 cifrar el campo bloodType con cifrado aleatorio, especifique lo siguiente en su esquema de cifrado:

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

Para cifrar el campo medicalRecords con cifrado aleatorio, especifique lo siguiente en su 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"
}
}
}
}

El esquema de cifrado completo para el inicio rápido 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"
}
}
}
}
}

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 Guía de inicio rápido de CSFLE.

Volver

Llaves y bóvedas de llaves

En esta página