MongoDB Academy · Lección

Cifrado a nivel de campo del lado del cliente

Configure el Client-Side Field Level Encryption de MongoDB para cifrar campos sensibles individuales antes de que salgan de la aplicación, manteniendo los datos en texto plano fuera del servidor.

Lección 4 de 413 pasos

Cifrado a nivel de campo del lado del cliente es una lección gratuita de MongoDB Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de MongoDB Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de MongoDB Academy incluye 4 lecciones en total.

¿Por qué cifrar a nivel de campo?

Incluso con TLS y cifrado en reposo, el servidor de MongoDB ve los datos en texto plano una vez descifrados del disco. Una cuenta de administrador de bases de datos comprometida, un ingeniero de la nube malintencionado con acceso al disco o una filtración de una copia de seguridad de la base de datos podrían exponer campos confidenciales. Client-Side Field Level Encryption (CSFLE) resuelve este problema cifrando campos confidenciales individuales —como números de la Seguridad Social, números de tarjetas de crédito o datos de salud— dentro del controlador del cliente, antes de que los datos lleguen al servidor. El servidor solo almacena texto cifrado.

Cómo funciona CSFLE a alto nivel

CSFLE utiliza dos capas de claves. La Customer Master Key (CMK) se almacena en un sistema externo de gestión de claves (AWS KMS, Azure Key Vault, GCP KMS o una clave local). La CMK cifra una Data Encryption Key (DEK), que se almacena en una colección de MongoDB llamada Key Vault. El controlador obtiene y descifra la DEK mediante la CMK en el momento de la consulta y, a continuación, utiliza la DEK para cifrar o descifrar los valores de campos individuales. El servidor nunca ve la CMK ni la DEK en texto plano.

Dos modos: automático y explícito

CSFLE ofrece dos modos de cifrado. Automatic CSFLE (requiere MongoDB Enterprise o Atlas) cifra y descifra campos de forma transparente según un esquema JSON; el código de su aplicación no cambia. Explicit (Manual) CSFLE está disponible en el controlador Community y requiere que la aplicación llame explícitamente a los métodos de cifrado y descifrado. El modo automático es mucho más práctico para proyectos nuevos; el explícito proporciona el máximo control sobre los campos que se cifran en cada operación.

Configuración de la colección Key Vault

Antes de cifrar datos, cree una colección Key Vault: una colección especial de MongoDB que almacena claves de cifrado de datos. El almacén de claves es simplemente una colección normal (por ejemplo, encryption.__keyVault), pero debe tener un índice único en el campo keyAltNames. Las DEK se almacenan como documentos BSON cuyo material de clave está cifrado mediante su CMK; incluso el almacén de claves solo guarda texto cifrado.

const { MongoClient, ClientEncryption } = require('mongodb-client-encryption')

// Step 1: Create key vault collection with unique index
const client = new MongoClient('mongodb://localhost:27017')
await client.connect()

const keyVaultColl = client.db('encryption').collection('__keyVault')
await keyVaultColl.createIndex(
  { keyAltNames: 1 },
  { unique: true, partialFilterExpression: { keyAltNames: { $exists: true } } }
)

Creación de una Data Encryption Key

Use el asistente ClientEncryption para crear una DEK. La clave se cifra mediante su CMK (en este caso, una clave maestra local para desarrollo) y se almacena en el almacén de claves. En producción, sustituya el proveedor local por aws, azure o gcp y proporcione las credenciales de KMS. Puede crear varias DEK; por ejemplo, una por cada inquilino en una aplicación multiinquilino.

const crypto = require('crypto')

// 96-byte local master key (development only — use KMS in production)
const localMasterKey = crypto.randomBytes(96)

const encryption = new ClientEncryption(client, {
  keyVaultNamespace: 'encryption.__keyVault',
  kmsProviders: { local: { key: localMasterKey } }
})

// Create a DEK with an alias for easy reference
const dataKey = await encryption.createDataKey('local', {
  keyAltNames: ['userSensitiveDataKey']
})
console.log('DEK id:', dataKey)

Definición del esquema de campos cifrados

Para CSFLE automático, defina un encrypted fields map que indique al controlador qué campos debe cifrar y con qué algoritmo. AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic produce el mismo texto cifrado para el mismo texto plano, lo que permite realizar consultas de igualdad sobre campos cifrados. AEAD_AES_256_CBC_HMAC_SHA_512-Random produce un texto cifrado diferente cada vez; es más seguro, pero no permite realizar consultas.

const encryptedFieldsMap = {
  'myApp.users': {
    fields: [
      {
        path: 'ssn',
        bsonType: 'string',
        // Deterministic: can query encrypted SSN with equality
        algorithm: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic',
        keyId: dataKey
      },
      {
        path: 'creditCardNumber',
        bsonType: 'string',
        // Random: cannot query, but stronger encryption
        algorithm: 'AEAD_AES_256_CBC_HMAC_SHA_512-Random',
        keyId: dataKey
      }
    ]
  }
}

Creación de un MongoClient con Auto-CSFLE

Para habilitar CSFLE automático, configure MongoClient con la opción autoEncryption, proporcionando el espacio de nombres del almacén de claves, las credenciales de KMS y el mapa de campos cifrados. El controlador cifrará automáticamente los campos coincidentes al insertar o actualizar, y los descifrará al leerlos. No es necesario modificar las consultas de su aplicación.

const secureClient = new MongoClient('mongodb://localhost:27017', {
  autoEncryption: {
    keyVaultNamespace: 'encryption.__keyVault',
    kmsProviders: { local: { key: localMasterKey } },
    encryptedFieldsMap: encryptedFieldsMap
  }
})

await secureClient.connect()
const users = secureClient.db('myApp').collection('users')

// SSN and creditCardNumber are auto-encrypted on insert
await users.insertOne({
  name: 'Alice',
  ssn: '123-45-6789',           // encrypted transparently
  creditCardNumber: '4111-1111-1111-1111'  // encrypted transparently
})

Consulta de campos cifrados

Con el cifrado determinista, puede realizar consultas de igualdad sobre campos cifrados: el controlador cifra el valor de la consulta con la misma DEK antes de enviarlo al servidor, de modo que el servidor compara textos cifrados. Con el cifrado aleatorio, las consultas de igualdad no son posibles porque el mismo texto plano produce un texto cifrado diferente cada vez. CSFLE no admite consultas por rango ni consultas regex sobre campos cifrados.

// Query an encrypted SSN field (deterministic encryption)
// The driver auto-encrypts '123-45-6789' before sending the query
const user = await users.findOne({ ssn: '123-45-6789' })

// The result has SSN decrypted automatically by the driver:
console.log(user.ssn)  // '123-45-6789' (decrypted)

// A client WITHOUT the key sees ciphertext:
// user.ssn = Binary(Buffer.from('...'), 6)  // encrypted blob

Cifrado explícito con la API del controlador

CSFLE explícito le proporciona control por operación. Llame a encryption.encrypt() antes de insertar y a encryption.decrypt() después de leer. Esto funciona con los controladores de la edición Community sin requerir la biblioteca compartida de CSFLE automático. Es más detallado, pero ofrece flexibilidad total: puede cifrar distintos campos en distintos documentos con distintas DEK.

// Explicit encryption
const encryptedSsn = await encryption.encrypt('123-45-6789', {
  algorithm: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic',
  keyAltName: 'userSensitiveDataKey'
})

await users.insertOne({
  name: 'Bob',
  ssn: encryptedSsn  // manually encrypted Binary value
})

// Explicit decryption
const doc = await users.findOne({ name: 'Bob' })
const decryptedSsn = await encryption.decrypt(doc.ssn)
console.log(decryptedSsn)  // '123-45-6789'

Rotación de claves para el cifrado a nivel de campo

Rote las DEK periódicamente para limitar el periodo de exposición en caso de que una clave se vea comprometida. La rotación de claves en CSFLE consiste en crear una DEK nueva, volver a cifrar todos los documentos que utilizan la DEK antigua (campo por campo) y eliminar después la DEK antigua del almacén de claves. Este proceso puede realizarse mediante un script de migración en segundo plano sin tiempo de inactividad. La rotación de CMK en KMS (envolver la DEK) no requiere modificar en absoluto los documentos cifrados.

Limitaciones y consideraciones de CSFLE

CSFLE tiene limitaciones importantes que debe prever: no se admiten operaciones del servidor sobre campos cifrados (no se admiten agregaciones, ordenaciones ni consultas por rango sobre campos cifrados, salvo las consultas de igualdad en campos deterministas); los cambios de esquema requieren reutilizar la DEK o volver a cifrar; CSFLE automático requiere MongoDB Enterprise o Atlas; y la sobrecarga de rendimiento del cifrado y descifrado en el controlador añade latencia. Diseñe su modelo de datos para minimizar los campos que necesitan cifrado.

Comprobación rápida

Compruebe su comprensión de los conceptos de MongoDB y las bases de datos NoSQL de esta lección.

Resumen de la lección

En esta lección ha aprendido lo siguiente: CSFLE cifra los campos confidenciales dentro del controlador antes de que los datos lleguen al servidor, por lo que ni siquiera MongoDB ve otra cosa que texto cifrado; el cifrado determinista permite consultas de igualdad, mientras que el cifrado aleatorio ofrece mayor seguridad, pero no permite realizar consultas; y el modelo de claves de dos niveles (CMK en KMS que envuelve la DEK en el almacén de claves) mantiene las claves de cifrado fuera de MongoDB. A continuación exploraremos los patrones de diseño de esquemas de MongoDB.

Gratis para empezar

Aprende JavaScript con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
30
Lecciones
120

Preguntas frecuentes

¿La lección «Cifrado a nivel de campo del lado del cliente» es gratis?

Sí — el texto completo de «Cifrado a nivel de campo del lado del cliente» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de MongoDB Academy, actualiza a CoddyKit PRO. El curso de MongoDB Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Cifrado a nivel de campo del lado del cliente»?

Configure el Client-Side Field Level Encryption de MongoDB para cifrar campos sensibles individuales antes de que salgan de la aplicación, manteniendo los datos en texto plano fuera del servidor. Practicas MongoDB Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar MongoDB Academy?

No se requiere experiencia previa. MongoDB Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Cifrado a nivel de campo del lado del cliente»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de MongoDB Academy?

Sí. Cada lección de MongoDB Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Mecanismos de autenticación: SCRAM y x.509
  2. Control de acceso basado en roles: roles integrados y personalizados
  3. Cifrado en reposo y TLS en tránsito
  4. Cifrado a nivel de campo del lado del cliente
← Volver a MongoDB Academy