Overview
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.
Consideraciones al habilitar la consulta
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.
Especificar campos para el cifrado
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 |
|---|---|---|
| String | Requerido |
| String | Requerido |
| Binario | Obligatorio. Especifique un valor clave para cada campo. NotaSi llama a |
| Objeto | Opcional. Incluir para que el campo sea consultable. |
Ejemplo
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.
Configurar campos para realizar consultas
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.
Ejemplo
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" }, ] }
Contención
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.
Ajuste del factor de contención
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.valinsertses el número de pares de campo/valor únicos insertados desde la última vez que se realizó una compactación de metadatos.ω∗ esω/valinsertsredondeado 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 a1.
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
Tipos de consulta
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:
doubledecimal128objectarray
Esquemas de cliente y servidor
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
encryptedFieldsMapcontiene 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
encryptedFieldsMapobjeto 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:
Habilitar el cifrado consultable
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.