Docs Menu
Docs Home
/ /

Cifrado de campos y consultabilidad

Obtenga más información sobre los siguientes temas de cifrado consultable:

  • Consideraciones al habilitar consultas en un campo cifrado.

  • Cómo especificar campos para el cifrado.

  • Cómo configurar un campo encriptado para que pueda consultarse.

  • Tipos de consulta y cuáles puedes utilizar en campos cifrados.

  • Cómo optimizar el rendimiento de las consultas en campos cifrados.

Al usar el cifrado consultable, puede elegir si desea que un campo cifrado sea consultable. Si no necesita realizar operaciones CRUD que requieran consultar un campo cifrado, es posible que no necesite habilitar la consulta en ese campo. Aun así, puede recuperar el documento completo consultando otros campos consultables o no cifrados.

Al habilitar la consulta de campos cifrados, el Cifrado Consultable crea un índice para cada campo cifrado, lo que puede aumentar la duración de las operaciones de escritura en dicho campo. Cuando una operación de escritura actualiza un campo indexado, MongoDB también actualiza el índice relacionado.

Cuando se crea una colección cifrada, MongoDB crea dos colecciones de metadatos, lo que aumenta los requisitos de espacio de almacenamiento.

Con el cifrado consultable, se especifican los campos que se desean cifrar automáticamente en el documento de MongoDB mediante un esquema de cifrado JSON. El esquema de cifrado define qué campos se cifran y qué consultas están disponibles para ellos.

Importante

Puede especificar cualquier campo para el cifrado excepto el _id campo.

Para especificar campos para cifrado y consulta, cree un esquema de cifrado que incluya las siguientes propiedades:

Nombre de la clave
Tipo
Requerido

path

String

Requerido

bsonType

String

Requerido

keyId

Binario

Obligatorio. Especifique un valor clave para cada campo.

Nota

Si llama a createEncryptedCollection() y keyId: null configura, el controlador MongoDB crea automáticamente una clave de datos. createEncryptedCollection Luego, devuelve un nuevo keyId esquema de cifrado con los nuevos valores.

queries

Objeto

Opcional. Incluir para que el campo sea consultable.

Este ejemplo muestra cómo crear el esquema de cifrado.

Considere el siguiente documento que contiene información de identificación personal (PII), información de tarjetas de crédito e información médica confidencial:

{
"firstName": "Jon",
"lastName": "Snow",
"patientId": 12345187,
"address": "123 Cherry Ave",
"medications": [
"Adderall",
"Lipitor"
],
"patientInfo": {
"ssn": "921-12-1234",
"billing": {
"type": "visa",
"number": "1234-1234-1234-1234"
}
}
}

Para garantizar la seguridad de la información personal identificable (PII) y la información médica confidencial, cree el esquema de cifrado y configure esos campos para el cifrado automático. Debe generar previamente una clave única para cada campo cifrado. Por ejemplo:

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

Configure AutoEncryptionSettings en el cliente y luego utilice el método auxiliar para crear sus createEncryptedCollection() colecciones.

Incluya la propiedad queries en los campos para que sean consultables. Esto permite que un cliente autorizado emita consultas de lectura y escritura en esos campos. Omitir la propiedad queries impide que los clientes consulten un campo.

Agregue la propiedad queries al esquema de ejemplo anterior para que los campos patientId y patientInfo.ssn sean consultables.

const encryptedFieldsObject = {
fields: [
{
path: "patientId",
bsonType: "int",
queries: { queryType: "equality" }
},
{
path: "patientInfo.ssn",
bsonType: "string",
queries: { queryType: "equality" }
},
{
path: "medications",
bsonType: "array"
},
{
path: "patientInfo.billing",
bsonType: "object"
},
]
}

Las operaciones de escritura simultáneas, como insertar el mismo par campo/valor en varios documentos en rápida sucesión, pueden causar contención: conflictos que retrasan las operaciones.

Con el cifrado consultable, MongoDB rastrea las ocurrencias de cada par campo-valor en una colección cifrada mediante un contador interno. El factor de contención particiona este contador, de forma similar a una matriz. Esto minimiza los problemas de incremento del contador al usar insert, update o findAndModify para añadir o modificar un campo cifrado con el mismo par campo-valor en una sucesión cercana. contention = 0 crea una matriz con un elemento en el índice 0. contention = 4 crea una matriz con 5 elementos en los índices 0-4. MongoDB incrementa un elemento aleatorio de la matriz durante la inserción.

Si no se configura, contention toma el valor predeterminado 8, lo que proporciona un alto rendimiento para la mayoría de las cargas de trabajo. Una mayor contención mejora el rendimiento de las operaciones de inserción y actualización en campos de baja cardinalidad, pero reduce el rendimiento de las búsquedas.

Opcionalmente, puedes incluir la propiedad contention en los campos consultables para cambiar el factor de contención desde su valor por defecto de 8. Antes de modificar el factor de contención, ten en cuenta los siguientes puntos:

Considere aumentar contention por encima del valor predeterminado de 8 solo si el campo tiene operaciones de escritura simultáneas frecuentes. Dado que los valores de contención altos sacrifican el rendimiento de búsqueda en favor de las operaciones de inserción y actualización, es poco probable que la ventaja de un factor de contención alto para un campo que se actualiza con poca frecuencia supere sus inconvenientes.

Considera reducir contention si un campo se query con frecuencia, pero rara vez se escribe. En este caso, el rendimiento de find es preferible al rendimiento de guardado y actualizado.

Puede calcular el factor de contención de un campo utilizando una fórmula donde:

  • ω Es el número de operaciones de escritura simultáneas en el campo en un período corto, como 30ms. Si se desconoce, se puede usar el número de núcleos virtuales del servidor.

  • valinserts es el número de pares de campo/valor únicos insertados desde la última vez que se realizó una compactación de metadatos.

  • ω es ω/valinserts redondeado hacia arriba al entero más cercano. Para una carga de trabajo de 100 operaciones con 1000 valores recientes, 100/1000 = 0.1, que se redondea a 1.

Un factor de contención razonable, cf, es el resultado de la siguiente fórmula, redondeado al entero positivo más cercano:

· (ω − 1)) / 0.2

Por ejemplo, si hay 100 operaciones de escritura simultáneas en un campo en 30ms,ω = 100 entonces. Si hay 50 valores únicos recientes para ese campo, entonces ω = 100/50 = 2∗. Esto da como cf = (2·1)/0.2 = 10 resultado.

Advertencia

No establezca el factor de contención en propiedades de los datos, como la frecuencia de pares campo-valor(cardinalidad). Establezca el factor de contención únicamente en función de su carga de trabajo.

Considere un caso donde ω = 100 y valinserts = 1000 resultan en ω = 100/1000 = 0.1 ≈ 1 cf = (1·0)/0.2 = 0 ≈ 1y. 20 de los valores aparece con mucha frecuencia, por lo que se establece contention = 3 en su lugar. Un atacante con acceso a varias instantáneas de la base de datos puede inferir que el valor alto indica pares campo-valor frecuentes. En este caso, dejar sin establecer,contention de modo que su valor predeterminado sea,8 impediría que el atacante obtuviera esa información.

Para obtener información completa sobre la contención y sus implicaciones criptográficas, consulte "Sección 9: Directrices" en MongoDB. Documento técnico sobre cifrado consultable

Al pasar un tipo de consulta a la opción queries del objeto de campos cifrados, se establecen los tipos de consulta permitidos para el campo. Consultar campos no cifrados o cifrados con un tipo de consulta compatible devuelve datos cifrados que se descifran en el cliente.

El cifrado consultable actualmente admite los tipos de consulta none y equality. Si no se especifica el tipo de consulta, el valor predeterminado es none. Si el tipo de consulta es none, el campo se cifra, pero los clientes no pueden consultarlo.

El tipo de consulta equality admite las siguientes expresiones:

Nota

Las consultas que comparan un campo cifrado con null o con una expresión regular generan un error, incluso con operadores de consulta admitidos.

Las consultas de cifrado consultables equality no admiten operaciones de lectura o escritura en un campo cuando la operación compara el campo cifrado con cualquiera de los siguientes tipos de BSON:

  • double

  • decimal128

  • object

  • array

MongoDB admite la validación de esquemas para aplicar el cifrado de campos específicos de una colección. Los clientes que utilizan el cifrado consultable automático tienen un comportamiento específico según la configuración de la conexión a la base de datos:

  • Si el objeto de conexión encryptedFieldsMap contiene una clave para la colección especificada, el cliente utiliza dicho objeto para realizar el cifrado consultable automático, en lugar de usar el esquema remoto. Como mínimo, las reglas locales deben cifrar los campos que el esquema remoto marca como que requieren cifrado.

  • Si el encryptedFieldsMap objeto de conexión no contiene una clave para la colección especificada, el cliente descarga el esquema remoto del lado del servidor para la colección y lo utiliza para realizar el cifrado consultable automático.

    Importante

    Consideraciones sobre el comportamiento

    Cuando un cliente no tiene un esquema de cifrado para la colección especificada, ocurre lo siguiente:

    • El cliente confía en que el servidor tiene un esquema válido con respecto al cifrado consultable automático.

    • El cliente utiliza el esquema remoto únicamente para realizar el cifrado automático consultable. No aplica ninguna otra regla de validación especificada en el esquema.

Para obtener más información sobre el cifrado consultable automático, consulte los siguientes recursos:

Habilite el cifrado consultable antes de crear una colección. Habilitar el cifrado consultable después de crear una colección no cifra los campos de los documentos que ya están en ella. Puede habilitar el cifrado consultable en los campos de dos maneras:

  • Pase el esquema de cifrado, representado por la constante encryptedFieldsObject, al cliente que la aplicación utiliza para crear la colección:

const client = new MongoClient(uri, {
autoEncryption: {
keyVaultNameSpace: "<your keyvault namespace>",
kmsProviders: "<your kms provider>",
extraOptions: {
cryptSharedLibPath: "<path to Automatic Encryption Shared Library>"
},
encryptedFieldsMap: {
"<databaseName.collectionName>": { encryptedFieldsObject }
}
}
...
await client.db("<database name>").createCollection("<collection name>");
}

Para obtener más información sobre autoEncryption las opciones de configuración de, consulte la sección Opciones de MongoClient para cifrado consultable.

  • Pase el objeto de campos cifrados a createCollection() para crear una nueva colección:

await encryptedDB.createCollection("<collection name>", {
encryptedFields: encryptedFieldsObject
});

Tip

Especifique los campos cifrados al crear la colección y al crear un cliente para acceder a ella. Esto garantiza que, si la seguridad del servidor se ve comprometida, la información se mantendrá cifrada a través del cliente.

Importante

Cree su colección explícitamente, en lugar de hacerlo implícitamente con una operación de inserción. Al crear una colección con createCollection(), MongoDB crea un índice en los campos cifrados. Sin este índice, las consultas en los campos cifrados pueden ser lentas.

Volver

Inicio rápido

En esta página