Overview
Puede usar el controlador de C++ para cifrar campos específicos de un documento mediante un conjunto de funciones llamadas cifrado en uso. Este cifrado permite que su aplicación cifre datos antes de enviarlos a MongoDB y consulte documentos con campos cifrados.
Advertencia
MongoDB 8.2 Problema conocido
Versión 8.2.0 de mongocryptd Es posible que no se ejecute en Windows. Este error afecta al cifrado en uso con el controlador si se especifica el argumento --logpath NUL al iniciar mongocryptd.
Para aprender más sobre este problema y cómo resolverlo, consulte Problemas conocidos en MongoDB 8.2 notas de versión.
El cifrado en uso impide que usuarios no autorizados vean datos de texto plano mientras se envían a MongoDB o mientras se encuentran en una base de datos cifrada. Para habilitar el cifrado en uso en una aplicación y autorizarla a descifrar datos, debe crear claves de cifrado a las que solo su aplicación pueda acceder. Solo las aplicaciones con acceso a sus claves de cifrado pueden acceder a los datos de texto plano descifrados. Si un atacante accede a la base de datos, solo podrá ver los datos cifrados, ya que no tiene acceso a las claves de cifrado.
Puedes utilizar el encriptación en uso para cifrar campos en tus documentos de MongoDB que contienen los siguientes tipos de datos sensibles:
Números de tarjetas de crédito
Direcciones
Información de salud
Información financiera
Cualquier otra información confidencial o de identificación personal (PII)
MongoDB ofrece las siguientes funcionalidades para habilitar el cifrado en uso:
Queryable Encryption
Queryable Encryption es la funcionalidad de cifrado de última generación en uso, que se introdujo por primera vez como funcionalidad en vista previa en MongoDB Server versión 6.0 y como funcionalidad generalmente disponible (GA) en MongoDB 7.0. La Queryable Encryption permite buscar la igualdad de los campos cifrados y cifra cada valor de manera única.
Importante
La funcionalidad de vista previa no es compatible con MongoDB 7.0
La implementación de Queryable Encryption en MongoDB 6.0 es incompatible con la versión GA introducida en MongoDB 7.0. La funcionalidad de vista previa de Queryable Encryption ya no es compatible.
Para obtener más información sobre el cifrado consultable, consulte Cifrado consultable en el manual del servidor MongoDB.
Encriptación a nivel de campo
El cifrado a nivel de campo del lado del cliente (CSFLE) admite la búsqueda de campos cifrados por igualdad. CSFLE difiere de Queryable Encryption en que puedes seleccionar, ya sea un algoritmo de cifrado determinista o aleatorio para cifrar campos. Cuando utilices CSFLE, solo podrás query campos cifrados que utilicen un algoritmo de cifrado determinista. Cuando utiliza un algoritmo de cifrado aleatorio para cifrar campos en CSFLE, pueden ser descifrados, pero no se pueden realizar consultas de igualdad en esos campos. Cuando utilices Queryable Encryption, no podrás especificar el algoritmo de cifrado, pero sí podrás consultar todos los campos cifrados.
Cuando cifras un valor de manera determinista, el mismo valor de entrada produce el mismo valor de salida. Si bien el cifrado determinista te permite realizar consultas en esos campos cifrados, los datos cifrados con baja cardinalidad son susceptibles a la ruptura de códigos mediante el análisis de frecuencia.
Tip
Para obtener más información sobre estos conceptos, consulta las siguientes entradas de Wikipedia:
Esta sección muestra cómo configurar CSFLE utilizando los siguientes mecanismos:
Configurar el cifrado automático
El cifrado automático te permite realizar operaciones de lectura y escritura cifradas sin especificar cómo cifrar los campos. Para habilitar el cifrado automático, utiliza uno de los siguientes métodos:
crypt_shared(Recomendado): Una librería dinámica que lee el esquema de cifrado para determinar qué campos cifrar y descifrar. Al utilizar esta librería, no es necesario iniciar un proceso separado para realizar un cifrado automático.mongocryptdUn ejecutable binario preempaquetado con MongoDB Enterprise Server que utiliza reglas de cifrado automático especificadas para marcar los campos para el cifrado.mongocryptdse genera automáticamente cuando creas un cliente con CSFLE habilitado, pero puedes iniciar explícitamente el binario en una instancia deoptions::auto_encryption.
Importante
mongocryptd requiere MongoDB Enterprise Server v4.2 o superior.
Para obtener más información sobre cómo configurar el cifrado automático, consulta Instalar y Configurar una Librería CSFLE en el manual de MongoDB Server.
Establecer un esquema de cifrado
Puede usar la opción schema_map para especificar un esquema de cifrado automático. Los esquemas de cifrado contienen reglas especificadas por el usuario que identifican qué campos deben cifrarse y cómo cifrarlos.
Establece la opción schema_map a un documento JSON que se alinee con la JSON schema Draft 4 sintaxis estándar. Este documento debe incluir los nombres de los campos a cifrar y un objeto encrypt anidado bajo cada nombre de campo, que establezca las opciones de cifrado que se utilizarán.
Tip
Para obtener más información sobre los esquemas de cifrado, consulta Esquemas de cifrado CSFLE en el manual del Servidor MongoDB.
El siguiente código muestra la sintaxis para especificar un documento de esquema JSON:
auto data_key_id = client_encryption.create_data_key("local"); auto json_schema = document{} << "properties" << open_document << "encryptedFieldName" << open_document << "encrypt" << open_document << "keyId" << open_array << data_key_id << close_array << "bsonType" << "string" << "algorithm" << "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" << close_document << close_document << close_document << "bsonType" << "object" << finalize;
Para ver un ejemplo completo que utilice el documento anterior json_schema para configurar un esquema de cifrado automático, consulte el CSFLE automático ejemplo en el código fuente del driver.
Configura el cifrado explícito
El cifrado explícito te permite realizar operaciones cifradas utilizando la librería de cifrado del driver. Para utilizar el cifrado explícito, debes especificar la lógica de cifrado en toda la aplicación.
El siguiente ejemplo configura el cifrado explícito para una operación de inserción, que inserta un mensaje cifrado en la base de datos:
// Configure your MongoDB client's encryption options here class client_encryption client_encryption(std::move(client_encryption_opts)); auto data_key_id = client_encryption.create_data_key("local"); options::encrypt encrypt_opts{}; encrypt_opts.key_id(data_key_id.view()); encrypt_opts.algorithm(options::encrypt::encryption_algorithm::k_deterministic); // Explicitly encrypts a BSON value auto to_encrypt = bsoncxx::types::bson_value::make_value("secret message"); auto encrypted_message = client_encryption.encrypt(to_encrypt, encrypt_opts); // Explicitly decrypts a BSON value auto decrypted_message = client_encryption.decrypt(encrypted_message); // Inserts the encrypted value into the database coll.insert_one(make_document(kvp("encryptedField", encrypted_message)));
Para ver un ejemplo completo que configura el cifrado explícito, consulte el ejemplo de cifrado explícito en el código fuente del controlador.
Cifrado explícito con desencriptado automático
Puedes configurar el cifrado explícito y el descifrado automático, lo que está habilitado para todos los usuarios. Para configurar el descifrado automático sin cifrado automático, crea una instancia de options::auto_encryption y establece su campo bypass_auto_encryption en true. Luego, aplica estas opciones a tu cliente.
El siguiente ejemplo crea una instancia de options::auto_encryption para configurar el cifrado explícito con descifrado automático y luego pasa esta instancia de opciones al campo auto_encryption_opts de una options::client. Esto crea un cliente configurado para usar descifrado automático:
options::auto_encryption auto_encrypt_opts{}; auto_encrypt_opts.bypass_auto_encryption(true); options::client client_opts{}; client_opts.auto_encryption_opts(std::move(auto_encrypt_opts)); class client client_encrypted {uri{}, std::move(client_opts)};
Para ver un ejemplo completo que configura el cifrado explícito con descifrado automático, consulta el ejemplo Descifrado Automático de Cifrado Explícito en el código fuente del controlador.
Información Adicional
Para obtener más información sobre CSFLE, consulte CSFLE en el manual de MongoDB Server.