Docs Menu
Docs Home
/ /

Cifrado de campos y capacidad de consulta

Aprende sobre los siguientes temas de Queryable Encryption:

  • 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.

Cuando se habilitan los campos cifrados para que sean consultables, Queryable Encryption crea un índice para cada campo cifrado, lo que puede hacer que las operaciones de guardar en ese campo sean más lentas. 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 los campos para el cifrado y la 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 identidad personal (PII), información de tarjetas de crédito e información médica sensible:

{
"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 Queryable Encryption, MongoDB rastrea las ocurrencias de cada par campo/valor en una colección cifrada utilizando un contador interno. El factor de contención divide este contador, de manera similar a un arreglo. Esto minimiza los problemas al incrementar el contador al utilizar insert, update o findAndModify para añadir o modificar un campo cifrado con el mismo par campo/valor en sucesión cercana. contention = 0 crea un arreglo con un elemento en el índice 0. contention = 4 crea un arreglo con 5 elementos en los índices 0-4. MongoDB incrementa un elemento aleatorio del arreglo 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:

Considera aumentar contention por encima del valor predeterminado de 8 solo si el campo tiene operaciones de escritura concurrentes frecuentes. Dado que los valores de alta contención sacrifican el rendimiento de búsqueda en favor de las operaciones de inserción y actualización, es poco probable que el beneficio de un alto factor de contención para un campo que rara vez se actualiza supere el inconveniente.

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.

Puedes calcular el factor de concurrencia para un campo utilizando una fórmula donde:

  • ω es el número de operaciones de guardar simultáneas en el campo en un corto periodo, como 30ms. Si no se conoce, puedes utilizar 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, entonces ω = 100. Si hay 50 valores únicos recientes para ese campo, entonces ω = 100/50 = 2. Esto da como resultado cf = (2·1)/0.2 = 10.

Advertencia

No se debe establecer el factor de contención en las propiedades de los propios datos, como la frecuencia de pares campo/valor (cardinalidad). Establezca el factor de contienda ú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 Queryable Encryption

Si se transmite un tipo de query a la opción queries en tu objeto de campos cifrados, se establecen los tipos de query permitidos para el campo. Consultar campos no cifrados o campos cifrados con un tipo de query compatible devuelve datos cifrados que luego 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 queries que comparan un campo cifrado con null o con una expresión regular resultan en un error, incluso con operadores del query admitidos.

Las queries de Queryable Encryption equality no admiten operaciones de lectura ni guardar en un campo cuando la operación compara el campo cifrado con cualquiera de los siguientes tipos 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.

  • Pasa 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 cuando cree la colección, y también cuando cree un cliente para acceder a la colección. Esto garantiza que si la seguridad del servidor se ve comprometida, la información siga estando 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