Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.

Utiliza el cifrado automático de nivel de campo del lado del cliente con Azure

Esta guía muestra cómo compilar una aplicación habilitada para Cifrado a Nivel de Campo del Lado del Cliente (CSFLE) utilizando Azure Key Vault.

Después de completar los pasos en esta guía, deberías tener:

  • Una llave maestra de cliente alojada en una instancia de Azure Key Vault.

  • Una aplicación cliente funcional que inserta documentos con campos cifrados utilizando tu clave maestra de cliente (CMK).

Para completar y ejecutar el código de esta guía, debes configurar tu entorno de desarrollo como se muestra en la página Requisitos de instalación.

A lo largo de esta guía, los ejemplos de código utilizan texto de marcador de posición. Antes de ejecutar los ejemplos, se deben sustituir los valores propios que se van a usar para estos marcadores.

Por ejemplo:

dek_id := "<Your Base64 DEK ID>"

Sustituya todo entre comillas por su ID de DEK.

dek_id := "abc123"

Seleccione el lenguaje de programación para el cual desea ver ejemplos de código en el menú desplegable Select your language en el lado derecho de la página.

Para ver el código completo de la aplicación de muestra, selecciona tu lenguaje de programación en el selector de lenguajes.

// You are viewing the .NET/C# driver code examples.// Use the dropdown menu to select a different driver.
1
  1. Inicie sesión en Azure.

  2. Registre su aplicación en Azure Active Directory

    Para registrar una aplicación en Azure Active Directory, sigue la Guía de inicio rápido oficial de Microsoft Registrar una aplicación con la plataforma de identidad de Microsoft.

    Importante

    Registra tus credenciales

    Asegúrese de registrar las siguientes credenciales:

    • ID de arrendatario

    • ID de cliente

    • Secreto del cliente

    Necesita estas credenciales para crear su objeto kmsProviders más adelante en este tutorial. También puedes autenticarse usando un token de acceso o mediante la obtención automática de credenciales. Para conocer todas las formas de credenciales disponibles para Azure, consulte Objeto kmsProviders.

2
  1. Cree su Azure Key Vault y su llave maestra de cliente

    Para crear una instancia nueva de Azure Key Vault y una llave maestra de cliente, sigue el establecimiento y recuperación de una clave de Azure Key Vault mediante el portal de Azure inicio rápido oficial de Microsoft.

    Nota

    La clave maestra de cliente debe tener un tamaño de clave RSA de 2048 o 4096 bits.

    Importante

    Registra tus credenciales

    Asegúrese de registrar las siguientes credenciales:

    • Nombre de la clave

    • Identificador clave (denominado keyVaultEndpoint más adelante en esta guía)

    • Versión clave

    Los necesitarás para crear tu objeto dataKeyOpts más adelante en este tutorial.

  2. Otorgar permisos

1

Crea un índice único en el campo keyAltNames de tu namespace encryption.__keyVault.

Seleccione la pestaña correspondiente al controlador MongoDB preferido:

var connectionString = "<Your MongoDB URI>";var keyVaultNamespace = CollectionNamespace.FromFullName("encryption.__keyVault");var keyVaultClient = new MongoClient(connectionString);var indexOptions = new CreateIndexOptions<BsonDocument>();indexOptions.Unique = true;indexOptions.PartialFilterExpression = new BsonDocument { { "keyAltNames", new BsonDocument { { "$exists", new BsonBoolean(true) } } } };var builder = Builders<BsonDocument>.IndexKeys;var indexKeysDocument = builder.Ascending("keyAltNames");var indexModel = new CreateIndexModel<BsonDocument>(indexKeysDocument, indexOptions);var keyVaultDatabase = keyVaultClient.GetDatabase(keyVaultNamespace.DatabaseNamespace.ToString());// Drop the Key Vault Collection in case you created this collection// in a previous run of this application. keyVaultDatabase.DropCollection(keyVaultNamespace.CollectionName);// Drop the database storing your encrypted fields as all// the DEKs encrypting those fields were deleted in the preceding line.keyVaultClient.GetDatabase("medicalRecords").DropCollection("patients");var keyVaultCollection = keyVaultDatabase.GetCollection<BsonDocument>(keyVaultNamespace.CollectionName.ToString());keyVaultCollection.Indexes.CreateOne(indexModel);
2
  1. Agrega tus credenciales de Azure Key Vault

    Agrega las credenciales de la cuenta de servicio a tu código de cliente habilitado para CSFLE.

    var kmsProviders = new Dictionary<string, IReadOnlyDictionary<string, object>>();var provider = "azure";var azureKmsOptions = new Dictionary<string, object>{ { "tenantId", "<Your Azure Tenant ID>" }, { "clientId", "<Your Azure Client ID>" }, { "clientSecret", "<Your Azure Client Secret>" },};
  2. Agrega tu información clave

    Actualiza el siguiente código para especificar tu llave maestra de cliente:

    Tip

    Registraste el ARN de tu llave maestra de cliente y la región en el paso Crear una llave maestra de cliente de esta guía.

    kmsProviders.Add(provider, azureKmsOptions);var dataKeyOptions = new DataKeyOptions(masterKey: new BsonDocument{ { "keyName", "<Your Azure Key Name>" }, { "keyVaultEndpoint", "<Your Azure Key Vault Endpoint>" },});
  3. Genere su clave de cifrado de datos

    Genera tu llave de cifrado de datos usando las variables declaradas en el paso uno de este tutorial.

    var clientEncryptionOptions = new ClientEncryptionOptions( keyVaultClient: keyVaultClient, keyVaultNamespace: keyVaultNamespace, kmsProviders: kmsProviders ); var clientEncryption = new ClientEncryption(clientEncryptionOptions);var dataKeyId = clientEncryption.CreateDataKey(provider, dataKeyOptions, CancellationToken.None);var dataKeyIdBase64 = Convert.ToBase64String(GuidConverter.ToBytes(dataKeyId, GuidRepresentation.Standard));Console.WriteLine($"DataKeyId [base64]: {dataKeyIdBase64}");

Tip

Obtén más información

Para ver un diagrama que muestre cómo tu aplicación cliente crea tu clave de cifrado de datos al usar un Azure Key Vault, consulta Arquitectura.

Para obtener más información sobre las opciones para crear una llave de cifrado de datos cifrada con una llave maestra de cliente alojada en Azure Key Vault, consulta Objeto kmsProviders y Objeto dataKeyOpts.

Tip

Consultar: Código completo

Para ver el código completo para crear una llave de cifrado de datos, consulta nuestro repositorio de Github

3

Tip

Siga los pasos restantes en este tutorial en un archivo separado del que se creó en los pasos previos.

Para ver el código completo de este archivo, consulta nuestro repositorio en Github

  1. Especifica el namespace de la Colección de Bóvedas de Llaves

    Especifica encryption.__keyVault como el namespace de la Colección de Bóvedas de Llaves.

    var keyVaultNamespace = CollectionNamespace.FromFullName("encryption.__keyVault");
  2. Especifica tus credenciales de Azure

    Especifique el proveedor de KMS de azure y sus credenciales de Azure:

    var kmsProviders = new Dictionary<string, IReadOnlyDictionary<string, object>>();var provider = "azure";var azureKmsOptions = new Dictionary<string, object>{ { "tenantId", "<Your Azure Tenant ID>" }, { "clientId", "<Your Azure Client ID>" }, { "clientSecret", "<Your Azure Client Secret>" },};kmsProviders.Add(provider, azureKmsOptions);
  3. Cree un esquema de cifrado para su colección

    Tip

    Añada la llave de cifrado de datos ID Base64

    Asegúrese de actualizar el siguiente código para incluir su ID de DEK Base64. Recibió este valor en el paso Generar tu llave de cifrado de datos de esta guía.

    var keyId = "<Your base64 DEK ID here>";var schema = new BsonDocument{ { "bsonType", "object" }, { "encryptMetadata", new BsonDocument("keyId", new BsonArray(new[] { new BsonBinaryData(Convert.FromBase64String(keyId), BsonBinarySubType.UuidStandard) })) }, { "properties", new BsonDocument { { "ssn", new BsonDocument { { "encrypt", new BsonDocument { { "bsonType", "int" }, { "algorithm", "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } } } }, { "bloodType", new BsonDocument { { "encrypt", new BsonDocument { { "bsonType", "string" }, { "algorithm", "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } } } } }, { "medicalRecords", new BsonDocument { { "encrypt", new BsonDocument { { "bsonType", "array" }, { "algorithm", "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } } } } }, { "insurance", new BsonDocument { { "bsonType", "object" }, { "properties", new BsonDocument { { "policyNumber", new BsonDocument { { "encrypt", new BsonDocument { { "bsonType", "int" }, { "algorithm", "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } } } } } } } } } }};var schemaMap = new Dictionary<string, BsonDocument>();schemaMap.Add(dbNamespace, schema);
  4. Especifica la ubicación de la librería compartida de cifrado automático

    var mongoBinariesPath = "<Full path to your Automatic Encryption Shared Library>";var extraOptions = new Dictionary<string, object>(){ { "cryptSharedLibPath", mongoBinariesPath },};

    Nota

    Opciones de cifrado automático

    Las opciones de cifrado automático proporcionan información de configuración a la Librería Compartida de Cifrado Automático, que modifica el comportamiento de la aplicación al acceder a campos cifrados.

    Para aprender más sobre la Librería Compartida de Cifrado Automático, consulte la página Instalar y Configurar un Componente de Análisis de Query CSFLE.

  5. Crea el cliente de Mongo

    Instancia un objeto cliente de MongoDB con la siguiente configuración de cifrado automático que utiliza las variables declaradas en los pasos previos:

    MongoClientSettings.Extensions.AddAutoEncryption(); // .NET/C# Driver v3.0 or later onlyvar clientSettings = MongoClientSettings.FromConnectionString(connectionString);var autoEncryptionOptions = new AutoEncryptionOptions( keyVaultNamespace: keyVaultNamespace, kmsProviders: kmsProviders, schemaMap: schemaMap, extraOptions: extraOptions );clientSettings.AutoEncryptionOptions = autoEncryptionOptions;var secureClient = new MongoClient(clientSettings);
4

Utiliza tu instancia de MongoClient habilitada para CSFLE para insertar un documento con campos cifrados en el namespace medicalRecords.patients usando el siguiente fragmento de código:

var sampleDocFields = new BsonDocument{ { "name", "Jon Doe" }, { "ssn", 145014000 }, { "bloodType", "AB-" }, { "medicalRecords", new BsonArray { new BsonDocument("weight", 180), new BsonDocument("bloodPressure", "120/80") } }, { "insurance", new BsonDocument { { "policyNumber", 123142 }, { "provider", "MaestCare" } } }}; // Construct an auto-encrypting clientvar secureCollection = secureClient.GetDatabase(db).GetCollection<BsonDocument>(coll); // Insert a document into the collectionsecureCollection.InsertOne(sampleDocFields);

Cuando insertas un documento, tu cliente habilitado con CSFLE cifra los campos de tu documento de modo que se asemejan a lo siguiente:

{ "_id": { "$oid": "<_id of your document>" }, "name": "Jon Doe", "ssn": { "$binary": "<cipher-text>", "$type": "6" }, "bloodType": { "$binary": "<cipher-text>", "$type": "6" }, "medicalRecords": { "$binary": "<cipher-text>", "$type": "6" }, "insurance": { "provider": "MaestCare", "policyNumber": { "$binary": "<cipher-text>", "$type": "6" } }}

Tip

Consultar: Código completo

Para ver el código completo para insertar un documento con campos cifrados, consulta nuestro repositorio de Github

5

Recupera el documento con campos cifrados que insertaste en el paso Insertar un documento con campos cifrados de esta guía.

Para mostrar la funcionalidad de CSFLE, el siguiente snippet de código query tu documento con un cliente configurado para CSFLE automático, así como un cliente que no está configurado para CSFLE automático.

Console.WriteLine("Finding a document with regular (non-encrypted) client.");var filter = Builders<BsonDocument>.Filter.Eq("name", "Jon Doe");var regularResult = regularCollection.Find(filter).Limit(1).ToList()[0];Console.WriteLine($"\n{regularResult}\n"); Console.WriteLine("Finding a document with encrypted client");var ssnFilter = Builders<BsonDocument>.Filter.Eq("name", "Jon Doe");var secureResult = secureCollection.Find(ssnFilter).Limit(1).First();Console.WriteLine($"\n{secureResult}\n");

La salida del código snippet precedente debería verse así:

Finding a document with regular (non-encrypted) client. { _id: new ObjectId("629a452e0861b3130887103a"), name: 'Jon Doe', ssn: new Binary(Buffer.from("0217482732d8014cdd9ffdd6e2966e5e7910c20697e5f4fa95710aafc9153f0a3dc769c8a132a604b468732ff1f4d8349ded3244b59cbfb41444a210f28b21ea1b6c737508d9d30e8baa30c1d8070c4d5e26", "hex"), 6), bloodType: new Binary(Buffer.from("0217482732d8014cdd9ffdd6e2966e5e79022e238536dfd8caadb4d7751ac940e0f195addd7e5c67b61022d02faa90283ab69e02303c7e4001d1996128428bf037dea8bbf59fbb20c583cbcff2bf3e2519b4", "hex"), 6), 'key-id': 'demo-data-key', medicalRecords: new Binary(Buffer.from("0217482732d8014cdd9ffdd6e2966e5e790405163a3207cff175455106f57eef14e5610c49a99bcbd14a7db9c5284e45e3ee30c149354015f941440bf54725d6492fb3b8704bc7c411cff6c868e4e13c58233c3d5ed9593eca4e4d027d76d3705b6d1f3b3c9e2ceee195fd944b553eb27eee69e5e67c338f146f8445995664980bf0", "hex"), 6), insurance: { policyNumber: new Binary(Buffer.from("0217482732d8014cdd9ffdd6e2966e5e79108decd85c05be3fec099e015f9d26d9234605dc959cc1a19b63072f7ffda99db38c7b487de0572a03b2139ac3ee163bcc40c8508f366ce92a5dd36e38b3c742f7", "hex"), 6), provider: 'MaestCare' }} Finding a document with encrypted client { _id: new ObjectId("629a452e0861b3130887103a"), name: 'Jon Doe', ssn: 241014209, bloodType: 'AB+', 'key-id': 'demo-data-key', medicalRecords: [ { weight: 180, bloodPressure: '120/80' } ], insurance: { policyNumber: 123142, provider: 'MaestCare' }}

Tip

Consultar: Código completo

Para ver el código completo para encontrar un documento con campos cifrados, consulta nuestro repositorio de Github

Para aprender cómo funciona CSFLE, consulta Fundamentos de CSFLE.

Para obtener más información sobre los temas mencionados en esta guía, consulta los siguientes enlaces:

  • Obtén más información sobre los componentes de CSFLE en la página de Referencias.

  • Descubre cómo funcionan las llaves maestras de cliente y las llaves de cifrado de datos en la página Claves de cifrado y Key Vaults

  • Consulta cómo los Proveedores de KMS gestionan tus claves CSFLE en la página de Proveedores de KMS.