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.
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 características para habilitar el cifrado en uso:
Queryable Encryption
El cifrado consultable es la función de cifrado en uso de próxima generación, introducida inicialmente como versión preliminar en MongoDB Server 6.0 y como función de disponibilidad general (GA) en MongoDB 7.0. El cifrado consultable permite buscar la igualdad en los campos cifrados y cifra cada valor de forma única.
Importante
Función de vista previa incompatible con MongoDB 7.0
La implementación del cifrado consultable en MongoDB 6.0 es incompatible con la versión GA introducida en MongoDB 7.0. La función de vista previa del cifrado consultable ya no es compatible.
Para obtener más información sobre el cifrado consultable, consulte Cifrado consultable en el manual del servidor MongoDB.
Cifrado a nivel de campo del lado del cliente
El cifrado a nivel de campo del lado del cliente (CSFLE) permite la búsqueda de igualdad en campos cifrados. CSFLE se diferencia del cifrado consultable en que permite seleccionar un algoritmo de cifrado determinista o aleatorio para cifrar los campos. Al usar CSFLE, solo se pueden consultar campos cifrados que utilicen un algoritmo de cifrado determinista. Al usar un algoritmo de cifrado aleatorio para cifrar campos en CSFLE, estos se pueden descifrar, pero no se pueden realizar consultas de igualdad en esos campos. Al usar el cifrado consultable, no se puede especificar el algoritmo de cifrado, pero se pueden consultar todos los campos cifrados.
Al cifrar un valor de forma determinista, el mismo valor de entrada produce el mismo valor de salida. Si bien el cifrado determinista permite realizar consultas en esos campos cifrados, los datos cifrados con baja cardinalidad son susceptibles de ser descifrados mediante 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 permite realizar operaciones de lectura y escritura cifradas sin especificar cómo cifrar los campos. Para habilitar el cifrado automático, utilice una de las siguientes opciones:
crypt_shared(Recomendado): Una biblioteca dinámica que lee el esquema de cifrado para determinar qué campos cifrar y descifrar. Al usar esta biblioteca, no es necesario generar un proceso independiente para realizar el cifrado automático.mongocryptd:Un binario preempaquetado con MongoDB Enterprise Server que utiliza reglas de cifrado automático específicas para marcar campos para cifrado.mongocryptdse genera automáticamente cuando crea un cliente habilitado para CSFLE, pero puede iniciar explícitamente el binario en una instanciaoptions::auto_encryption.
Importante
mongocryptd requiere MongoDB Enterprise Server v4.2 o posterior.
Para obtener más información sobre cómo configurar el cifrado automático, consulte Instalar y configurar una biblioteca CSFLE en el manual del servidor MongoDB.
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 definidas por el usuario que identifican qué campos deben cifrarse y cómo hacerlo.
Establezca la schema_map opción en un documento JSON que cumpla con la 4 sintaxis estándar del borrador del esquema JSON. Este documento debe incluir los nombres de los campos que se cifrarán y un encrypt objeto anidado bajo cada nombre de campo, que define 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 utiliza el json_schema documento anterior para configurar un esquema de cifrado automático, consulte el ejemplo CSFLE automático en el código fuente del controlador.
Configurar el cifrado explícito
El cifrado explícito permite realizar operaciones cifradas mediante la biblioteca de cifrado del controlador. Para usar el cifrado explícito, debe 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
Puede configurar el cifrado explícito y el descifrado automático, compatibles con todos los usuarios. Para configurar el descifrado automático sin cifrado automático, cree una instancia options::auto_encryption y configure su campo bypass_auto_encryption como true. A continuación, aplique estas opciones a su cliente.
El siguiente ejemplo crea una instancia options::auto_encryption para configurar el cifrado explícito con descifrado automático y, a continuación, pasa esta instancia de opciones al campo auto_encryption_opts de un options::client. Esto crea un cliente configurado para usar el 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, consulte el ejemplo de 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.