Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
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 los campos para el cifrado.

  • Cómo configurar un campo cifrado para que sea visible en las consultas.

  • Tipos de query y cuáles puede utilizar en campos cifrados.

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

Cuando usas Queryable Encryption, puedes elegir si hacer que un campo cifrado sea consultable. Si no necesitas realizar operaciones CRUD que requieran realizar una query en un campo cifrado, es posible que no necesites habilitar la query en ese campo. Aun así puedes recuperar el documento completo consultando otros campos que sean consultables o no estén 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 Queryable Encryption, puedes especificar qué campos quieres cifrar automáticamente en tu documento de MongoDB, utilizando un esquema de cifrado JSON. El esquema de cifrado define qué campos están cifrados y qué consultas están disponibles para esos campos.

Importante

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

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

Requerido. Especifique un valor clave para cada campo.

Nota

Si llamas a createEncryptedCollection() y configuras keyId: null, el controlador de MongoDB crea automáticamente una clave de datos. createEncryptedCollection luego devuelve un nuevo esquema de cifradoa con los nuevos valores de keyId.

queries

Objeto

opcional. Incluya 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 que la PII y la información médica sensible se mantengan seguras, crea el esquema de cifrado y configura esos campos para el cifrado automático. Debes generar una clave única para cada campo cifrado por adelantado. 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"
}
]
}

Configura AutoEncryptionSettings en el cliente y luego utiliza el método asistente createEncryptedCollection() para crear tus colecciones.

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

Agrega 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 concurrentes, como insertar el mismo par de campo/valor en varios documentos en rápida sucesión, pueden provocar 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.

Cuando no se establece, contention se configura por defecto en 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 disminuye el rendimiento de búsqueda.

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 únicos campo/valor insertados desde la última vez que se realizó 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 en el que ω = 100 y valinserts = 1000, resultando en ω = 100/1000 = 0.1 ≈ 1 y cf = (1·0)/0.2 = 0 ≈ 1. 20 de los valores aparecen con mucha frecuencia, por lo que en su lugar se configura contention = 3. Un atacante con acceso a múltiples instantáneas de la base de datos puede inferir que el ajuste alto indica pares de campo/valor frecuentes. En este caso, dejar contention sin configurar para que su valor sea por defecto 8 evitaría que el atacante tuviera esa información.

Para obtener información detallada sobre la contención y sus implicaciones criptográficas, consulta la "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.

Queryable Encryption admite actualmente none y equality tipos de queries. Si el tipo de query no se especifica, por defecto es none. Si el tipo de query es none, el campo está cifrado, pero los clientes no pueden consultar el query.

El tipo de query equality soporta 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 el uso de validación de esquema para aplicar el cifrado de campos específicos en una colección. Los clientes que usan Queryable Encryption automático tienen comportamientos específicos según la configuración de conexión de la base de datos:

  • Si el objeto de conexión encryptedFieldsMap contiene una clave para la colección especificada, el cliente utiliza ese objeto para realizar el cifrado Queryable Encryption de forma automática, en vez de utilizar el esquema remoto. Como mínimo, las reglas locales deben cifrar aquellos campos que el esquema remoto marque como requeridos de 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 Queryable Encryption 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 en lo que respecta al cifrado autoconsultable (Queryable Encryption).

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

Para aprender más sobre el automático Queryable Encryption, consulte los siguientes recursos:

Habilita Queryable Encryption antes de crear una colección. Activar el cifrado consultable después de crear una colección no cifra los campos de los documentos que ya están en esa colección. Puedes habilitar Queryable Encryption en campos de dos maneras:

  • Pase el esquema de cifrado, representado por la constante encryptedFieldsObject, al cliente que la aplicación usa 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 las opciones de configuración de autoEncryption, consulte la sección Opciones MongoClient para Queryable Encryption.

  • 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 explícitamente su colección, en lugar de crearla implícitamente con una operación de inserción. Cuando creas una colección usando createCollection(), MongoDB crea un índice en los campos cifrados. Sin este índice, las queries en campos cifrados pueden ejecutarse lentamente.

Volver

Inicio rápido

En esta página