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
/ /

Gestión de colecciones cifradas

Es importante comprender el rendimiento y los costos de almacenamiento del cifrado a nivel de campo. Cada campo cifrado:

  • Agrega guardados a las operaciones de inserción y actualización.

  • Se requiere almacenamiento adicional, ya que MongoDB mantiene un índice de campo cifrado.

Esta sección enumera las escrituras por operación y explica cómo compactar los índices de colección cifrados para que pueda minimizar los costos de escritura y almacenamiento.

Queryable Encryption introduce la capacidad de cifrar campos sensibles en tus documentos utilizando cifrado aleatorizado, al mismo tiempo que puedes consultar los campos cifrados.

Con Queryable Encryption, un valor de texto sin formato dado siempre se cifra en un texto cifrado diferente, aunque siga siendo consultable. Para habilitar esta funcionalidad, Queryable Encryption utiliza tres estructuras de datos:

  • Dos colecciones de metadatos

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

Importante

Es fundamental que estas estructuras de datos no se modifiquen ni se borren; de lo contrario, los resultados de las queries serán incorrectos.

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

  • enxcol_.<collectionName>.escllamado ESC

  • enxcol_.<collectionName>.ecocllamado 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 encriptado consultable, MongoDB actualiza las colecciones de metadatos para mantener un índice que permita la consulta. El campo se convierte en un "campo indexado". Esto genera un costo en almacenamiento y velocidad de escritura para cada campo de este tipo.

Cuando descartes una colección cifrada, descarta inmediatamente las colecciones de metadatos asociadas enxcol_.<collectionName>.esc y enxcol_.<collectionName>.ecoc. De lo contrario, volver a crear la colección con el mismo nombre pone las colecciones de metadatos en un estado de conflicto que consume espacio de almacenamiento excesivo y degrada el rendimiento CRUD.

Los costos de almacenamiento y escritura aumentan según la cantidad de campos indexados por documento.

Importante

Se espera que una colección de cifrado consultable tenga entre el doble y el triple de requisitos de almacenamiento que los documentos, para cubrir las colecciones de metadatos. Por ejemplo, una colección de 1 GB podría requerir entre 2 y 3 GB de almacenamiento.

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

  • Una grabación sobre ESC

  • Una grabación sobre 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.

  • Una grabación sobre ESC

  • Una grabación sobre ECOC

Ejemplo

Actualizar un documento con dos campos indexados requiere:

  • Un guardado en la colección cifrada.

  • Cuatro escrituras en las colecciones de metadatos.

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

A medida que insertas o actualizas documentos, las colecciones de metadatos cambian y crecen. La compactación de la colección de metadatos poda las colecciones de metadatos y reduce su tamaño.

Importante

Debe ejecutar manualmente la compactación de la recopilación de metadatos. La compactación solo funciona en clientes configurados para el cifrado consultable.

Ejecuta la compactación cuando el tamaño de ECOC supere los 1 GB.

Puedes comprobar el tamaño de tus colecciones usando mongosh y emitir el comando db.collection.totalSize().

Ejemplo

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

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

Para ejecutar la compactación de la colección de metadatos, utilice mongosh y ejecute el db.collection.compactStructuredEncryptionData() comando para reducir el tamaño de las colecciones de metadatos.

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,
...
}

Volver

Campos y query

En esta página