Docs Menu
Docs Home
/ /

Colecciones encriptadas

El cifrado a nivel de campo conlleva costes de rendimiento y almacenamiento. Cada campo que elija cifrar:

  • Agrega escrituras para insertar y actualizar operaciones.

  • Requiere almacenamiento adicional, porque MongoDB mantiene un índice de campos cifrados para mejorar el rendimiento de las consultas.

Esta sección resume el impacto del cifrado de colecciones en el almacenamiento y la escritura, y explica cómo compactar los índices de colecciones cifradas para minimizar estos costos. Si desea cifrar campos y configurarlos para consultas, consulte Campos cifrados y consultas habilitadas.

El cifrado consultable presenta la capacidad de cifrar campos confidenciales en sus documentos mediante cifrado aleatorio, sin dejar de poder consultar los campos cifrados.

Con el cifrado consultable, un valor de texto simple siempre se cifra en un texto cifrado diferente, sin dejar de ser consultable. Para habilitar esta funcionalidad, el cifrado consultable utiliza tres estructuras de datos:

  • Dos colecciones de metadatos

  • Un campo en cada documento de la colección cifrada llamado __safeContent__

Advertencia

Es fundamental que estas estructuras de datos no se modifiquen ni eliminen, o los resultados de la consulta serán incorrectos.

Cuando crea una colección cifrada, MongoDB crea dos colecciones de metadatos:

  • enxcol_.<collectionName>.esc, conocido como ESC

  • enxcol_.<collectionName>.ecoc, conocido como ECOC

Ejemplo

Si crea una colección llamada "pacientes", MongoDB crea las siguientes colecciones de metadatos:

  • enxcol_.patients.esc

  • enxcol_.patients.ecoc

Al insertar documentos con un campo cifrado consultable, MongoDB actualiza las colecciones de metadatos para mantener un índice que permite la consulta. El campo se convierte en un "campo indexado". Esto implica un coste en almacenamiento y velocidad de escritura para cada uno de estos campos.

Importante

Cuando elimine una colección cifrada, elimine inmediatamente después las colecciones de metadatos asociadas:

  • enxcol_.<collectionName>.esc

  • enxcol_.<collectionName>.ecoc

De lo contrario, volver a crear la colección con el mismo nombre coloca las colecciones de metadatos en un estado de conflicto que consume exceso de espacio de almacenamiento y degrada el rendimiento de CRUD.

Las consultas de igualdad conllevan costos fijos adicionales por operaciones de almacenamiento y escritura. Los costos de las consultas de rango dependen de los parámetros del campo consultable. Limitar estrictamente estas consultas reduce considerablemente su impacto en el rendimiento.

Al insertar un documento, cada campo indexado requiere dos escrituras adicionales en las colecciones de metadatos.

  • Uno escribe a ESC

  • Uno escribe a ECOC

Ejemplo

Para insertar un documento con dos campos indexados se requiere:

  • Un guardado en la colección cifrada.

  • Cuatro escrituras en las colecciones de metadatos.

Al actualizar un documento, cada campo indexado requiere dos escrituras adicionales en las colecciones de metadatos.

  • Uno escribe a ESC

  • Uno escribe a ECOC

Ejemplo

Para actualizar un documento con dos campos indexados se requiere:

  • Un guardado en la colección cifrada.

  • Cuatro escrituras en las colecciones de metadatos.

Al eliminar un documento, los campos indexados no requieren escrituras adicionales.

Antes de cualquier compactación de metadatos, ESC y ECOC contienen un documento de metadatos por cada par campo-valor de cada campo indexado. Indexar un par campo-valor cifrado en 1000 documentos requiere 1000 documentos en ESC y 1000 documentos en ECOC.

Nota

Una colección de Queryable Encryption que cifra todos los campos puede requerir hasta 2-3 veces el espacio de almacenamiento para acomodar colecciones de metadatos. Por ejemplo, una colección de 1 GB puede tener un requisito de almacenamiento de 2-3 GB.

  • No cifre los campos que no lo necesiten. La mayoría de los datos solo requieren el cifrado de un pequeño subconjunto de campos, como los que contienen información de identificación personal.

  • No habilites consultas por rango en un campo si las consultas de igualdad son suficientes para tus usuarios.

  • Para los campos cifrados con consultas de rango habilitadas, revise la configuración del campo, especialmente los parámetros mínimo, máximo y de precisión. Establecer límites estrictos para las consultas de rango reduce considerablemente el impacto en el rendimiento de esos campos.

  • Modele sus datos y cree un prototipo para determinar los aumentos reales de almacenamiento y escritura para su implementación.

A medida que se insertan o actualizan documentos, las colecciones de metadatos cambian y crecen. La compactación de colecciones de metadatos vacía el ECOC y reduce el tamaño del ESC.

Importante

En el peor de los casos, la ejecución de la compactación de metadatos revela la cantidad de pares de campo/valor únicos insertados en todos los documentos desde la compactación anterior.

Para obtener detalles sobre la información exacta revelada por la compactación de metadatos, consulte "Sección:6 Análisis teórico" y "Sección:9 Pautas" en el Documento técnico sobre cifrado consultable de MongoDB.

Como práctica recomendada, mantenga un registro de la siguiente información:

  • encfields:el número de campos cifrados por documento.

  • docinserts:el número de documentos insertados desde la última compactación.

  • valinserts:la cantidad de pares de campo/valor únicos insertados desde la última compactación.

Para reducir el tamaño de la colección de metadatos ESC en al menos t documentos, ejecute la compactación de metadatos cuando se cumpla la siguiente fórmula:

(encfields · docinserts) - valinsertst

La cantidad de campos cifrados por documento multiplicada por la cantidad de inserciones desde la última compactación, menos la cantidad de pares de campo/valor únicos insertados en todos los documentos desde la última compactación, debe ser mayor o igual a la cantidad de documentos a eliminar de ESC.

Por ejemplo, en una colección con seis campos cifrados, puede reducir el tamaño de ESC en al menos 1000 documentos cuando la cantidad total de documentos insertados y los pares de campo/valor únicos insertados desde la última compactación cumplen las siguientes condiciones:

(6 · docinserts) - valinserts1000

La fórmula se cumpliría, por ejemplo, si se insertaran 200 documentos desde la última compactación con un total de 200 pares de campo/valor únicos en todos los documentos, o si se insertaran 400 documentos desde la última compactación con 700 pares de campo/valor únicos.

Debe ejecutar la compactación de metadatos manualmente. Use y ejecute mongosh el db.collection.compactStructuredEncryptionData() comando:

Ejemplo

const eDB = "encryption"
const eKV = "__keyVault"
const secretDB = "records"
const secretCollection = "patients"
const localKey = fs.readFileSync("master-key.txt")
const localKeyProvider = { key: localKey }
const queryableEncryptionOpts = {
kmsProviders: { local: localKeyProvider },
keyVaultNamespace: `${eDB}.${eKV}`,
}
const encryptedClient = Mongo("localhost:27017", queryableEncryptionOpts)
const encryptedDB = encryptedClient.getDB(secretDB)
const encryptedCollection = encryptedDB.getCollection(secretCollection)
encryptedCollection.compactStructuredEncryptionData()
{
"stats": {
...
},
"ok": 1,
...
}

Puede comprobar el tamaño de una colección de metadatos utilizando y mongosh db.collection.totalSize() ejecutando el comando.

Ejemplo

En este ejemplo, la colección cifrada se llama "pacientes".

db.enxcol_.patients.esc.totalSize()
1407960328

Volver

Cifrar colecciones en la creación