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

Inicio rápido del cifrado consultable

Esta guía muestra cómo compilar una aplicación que implemente la funcionalidad de Queryable Encryption de MongoDB para encriptar y desencriptar automáticamente los campos de documento.

Selecciona el driver de lenguaje en el menú desplegable a la derecha para aprender cómo crear una aplicación que encripta y desencripta automáticamente los campos de documento.

Nota

MongoDB Community Edition no es compatible con Queryable Encryption con cifrado automático. Debes usar MongoDB Atlas o MongoDB Enterprise Advanced para implementar esta aplicación de muestra.

Importante

No uses esta aplicación de muestra en producción

Debido a que las instrucciones de este tutorial incluyen almacenar una clave de cifrado en un entorno inseguro, no debe usar una versión no modificada de esta aplicación en producción. El uso de esta aplicación en producción acarrea el riesgo de acceso no autorizado a la llave de cifrado o la pérdida de la clave necesaria para descifrar tus datos. El propósito de este tutorial es demostrar cómo usar Queryable Encryption sin necesidad de configurar un sistema de gestión de clave.

Puede utilizar un sistema de gestión de claves para almacenar de forma segura su clave de cifrado en un entorno de producción. KMS es un servicio remoto que almacena y administra de forma segura sus claves de cifrado. Para aprender a configurar una aplicación con cifrado consultable que utilice un KMS, consulte los tutoriales de cifrado consultable.

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.

Tip

Ver: Solicitud completa

Para ver el código completo de esta aplicación de muestra, selecciona la pestaña correspondiente a tu lenguaje de programación y sigue el enlace proporcionado. Cada repositorio de aplicaciones de muestra incluye README.md file that you can use to learn how to set up your environment and run the application. (archivo que puedes usar para aprender cómo configurar tu entorno y ejecutar la aplicación.)

Solicitud completa de mongosh

Aplicación Node.js completa

Tip

Tutoriales de integración de controladores

Para utilizar la biblioteca Mongoose para implementar el cifrado consultable, consulte el Tutorial: Cifrado consultable con Mongoose en la documentación del controlador Node.js.

Aplicación completa de Python

Tip

Tutoriales de integración de controladores

Para utilizar el cifrado consultable en una aplicación Django, consulte el Tutorial: Cifrado consultable con Django MongoDB Backend en la documentación de Django MongoDB Backend.

1

Los muestras de código de este tutorial utilizan las siguientes variables para llevar a cabo el flujo de trabajo Queryable Encryption:

  • kmsProviderName - El KMS que estás utilizando para almacenar tu clave maestra de cliente. Establece esta variable en "local" para este tutorial.

  • uri - Su URI de conexión de implementación de MongoDB. Establece tu URI de conexión en la variable de entorno MONGODB_URI o reemplaza directamente el valor.

  • keyVaultDatabaseName - La base de datos en MongoDB donde se almacenarán sus llaves de cifrado de datos (DEK). Configure esta variable en "encryption".

  • keyVaultCollectionName - La colección en MongoDB donde se almacenarán tus DEKs. Establece esta variable en "__keyVault", que es la convención para evitar confundirla con una colección de usuarios.

  • keyVaultNamespace - El namespace en MongoDB donde se almacenarán sus DEK. Establezca esta variable con los valores de las variables keyVaultDatabaseName y keyVaultCollectionName, separadas por un punto.

  • encryptedDatabaseName - La base de datos en MongoDB donde se almacenarán sus datos cifrados. Establece esta variable a "medicalRecords".

  • encryptedCollectionName - La colección en MongoDB donde se almacenarán tus datos cifrados. Establece esta variable a "patients".

Puede declarar estas variables utilizando el siguiente código:

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
const kmsProviderName = "<Your KMS Provider Name>";
const uri = process.env.MONGODB_URI; // Your connection URI
const keyVaultDatabaseName = "encryption";
const keyVaultCollectionName = "__keyVault";
const keyVaultNamespace = `${keyVaultDatabaseName}.${keyVaultCollectionName}`;
const encryptedDatabaseName = "medicalRecords";
const encryptedCollectionName = "patients";
  • kmsProviderName: el KMS que utiliza para almacenar su clave maestra de cliente. Configure este valor en "local" para este tutorial.

  • keyVaultDatabaseName - La base de datos en MongoDB donde se almacenarán sus llaves de cifrado de datos (DEK). Establece el valor de keyVaultDatabaseName en "encryption".

  • keyVaultCollectionName - La colección en MongoDB donde se almacenarán tus DEKs. Establece esta variable en "__keyVault", que es la convención para evitar confundirla con una colección de usuarios.

  • keyVaultNamespace - El namespace en MongoDB donde se almacenarán sus DEK. Establece keyVaultNamespace en un nuevo objeto CollectionNamespace cuyo nombre es el de las variables keyVaultDatabaseName y keyVaultCollectionName, separadas por un punto.

  • encryptedDatabaseName: La base de datos en MongoDB donde se almacenarán sus datos cifrados. Establezca el valor de encryptedDatabaseName "medicalRecords"en.

  • encryptedCollectionName: la colección en MongoDB donde se almacenarán tus datos cifrados. Establecer el valor de encryptedCollectionName a "patients".

  • uri - Su URI de conexión de implementación de MongoDB. Establezca su URI de conexión en el archivo appsettings.json o reemplace el valor directamente.

Tip

appsettings.json Ubicación

Al ejecutar la aplicación, el archivo appsettings.json debe estar en el mismo directorio que el ejecutable compilado. Si utiliza el archivo de proyecto del tutorial, la configuración CopyToOutputDirectory copia automáticamente appsettings.json al directorio de salida bin al compilar.

Puede declarar estas variables utilizando el siguiente código:

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
const string kmsProviderName = "<your KMS provider name>";
const string keyVaultDatabaseName = "encryption";
const string keyVaultCollectionName = "__keyVault";
var keyVaultNamespace =
CollectionNamespace.FromFullName($"{keyVaultDatabaseName}.{keyVaultCollectionName}");
const string encryptedDatabaseName = "medicalRecords";
const string encryptedCollectionName = "patients";
var appSettings = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
var uri = appSettings["MongoDbUri"];
  • kmsProviderName - El KMS que estás utilizando para almacenar tu clave maestra de cliente. Establece esta variable en "local" para este tutorial.

  • uri - Su URI de conexión de implementación de MongoDB. Establece tu URI de conexión en la variable de entorno MONGODB_URI o reemplaza directamente el valor.

  • keyVaultDatabaseName - La base de datos en MongoDB donde se almacenarán sus llaves de cifrado de datos (DEK). Configure esta variable en "encryption".

  • keyVaultCollectionName - La colección en MongoDB donde se almacenarán tus DEKs. Establece esta variable en "__keyVault", que es la convención para evitar confundirla con una colección de usuarios.

  • keyVaultNamespace - El namespace en MongoDB donde se almacenarán sus DEK. Establezca esta variable con los valores de las variables keyVaultDatabaseName y keyVaultCollectionName, separadas por un punto.

  • encryptedDatabaseName - La base de datos en MongoDB donde se almacenarán sus datos cifrados. Establece esta variable a "medicalRecords".

  • encryptedCollectionName - La colección en MongoDB donde se almacenarán tus datos cifrados. Establece esta variable a "patients".

Puede declarar estas variables utilizando el siguiente código:

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
kmsProviderName := "<KMS provider name>"
uri := os.Getenv("MONGODB_URI") // Your connection URI
keyVaultDatabaseName := "encryption"
keyVaultCollectionName := "__keyVault"
keyVaultNamespace := keyVaultDatabaseName + "." + keyVaultCollectionName
encryptedDatabaseName := "medicalRecords"
encryptedCollectionName := "patients"
  • kmsProviderName - El KMS que estás utilizando para almacenar tu clave maestra de cliente. Establece esta variable en "local" para este tutorial.

  • uri - Su URI de conexión de implementación de MongoDB. Establece tu URI de conexión en la variable de entorno MONGODB_URI o reemplaza directamente el valor.

  • keyVaultDatabaseName - La base de datos en MongoDB donde se almacenarán sus llaves de cifrado de datos (DEK). Configure esta variable en "encryption".

  • keyVaultCollectionName - La colección en MongoDB donde se almacenarán tus DEKs. Establece esta variable en "__keyVault", que es la convención para evitar confundirla con una colección de usuarios.

  • keyVaultNamespace - El namespace en MongoDB donde se almacenarán sus DEK. Establezca esta variable con los valores de las variables keyVaultDatabaseName y keyVaultCollectionName, separadas por un punto.

  • encryptedDatabaseName - La base de datos en MongoDB donde se almacenarán sus datos cifrados. Establece esta variable a "medicalRecords".

  • encryptedCollectionName - La colección en MongoDB donde se almacenarán tus datos cifrados. Establece esta variable a "patients".

Puede declarar estas variables utilizando el siguiente código:

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
String kmsProviderName = "<KMS provider name>";
String uri = QueryableEncryptionHelpers.getEnv("MONGODB_URI"); // Your connection URI
String keyVaultDatabaseName = "encryption";
String keyVaultCollectionName = "__keyVault";
String keyVaultNamespace = keyVaultDatabaseName + "." + keyVaultCollectionName;
String encryptedDatabaseName = "medicalRecords";
String encryptedCollectionName = "patients";
  • kmsProviderName - El KMS que estás utilizando para almacenar tu clave maestra de cliente. Establece esta variable en "local" para este tutorial.

  • uri - Su URI de conexión de implementación de MongoDB. Establece tu URI de conexión en la variable de entorno MONGODB_URI o reemplaza directamente el valor.

  • keyVaultDatabaseName - La base de datos en MongoDB donde se almacenarán sus llaves de cifrado de datos (DEK). Configure esta variable en "encryption".

  • keyVaultCollectionName - La colección en MongoDB donde se almacenarán tus DEKs. Establece esta variable en "__keyVault", que es la convención para evitar confundirla con una colección de usuarios.

  • keyVaultNamespace - El namespace en MongoDB donde se almacenarán sus DEK. Establezca esta variable con los valores de las variables keyVaultDatabaseName y keyVaultCollectionName, separadas por un punto.

  • encryptedDatabaseName - La base de datos en MongoDB donde se almacenarán sus datos cifrados. Establece esta variable a "medicalRecords".

  • encryptedCollectionName - La colección en MongoDB donde se almacenarán tus datos cifrados. Establece esta variable a "patients".

Puede declarar estas variables utilizando el siguiente código:

// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
const kmsProviderName = "<Your KMS Provider Name>";
const uri = process.env.MONGODB_URI; // Your connection URI
const keyVaultDatabaseName = "encryption";
const keyVaultCollectionName = "__keyVault";
const keyVaultNamespace = `${keyVaultDatabaseName}.${keyVaultCollectionName}`;
const encryptedDatabaseName = "medicalRecords";
const encryptedCollectionName = "patients";
  • kms_provider_name - El KMS que utilizas para almacenar tu llave maestra de cliente. Establece esta variable en "local" para este tutorial.

  • uri - Su URI de conexión de implementación de MongoDB. Establece tu URI de conexión en la variable de entorno MONGODB_URI o reemplaza directamente el valor.

  • key_vault_database_name: La base de datos de MongoDB donde se almacenarán sus claves de cifrado de datos (DEK). Establezca esta variable "encryption" en.

  • key_vault_collection_name - La colección en MongoDB donde se almacenarán tus DEK. Establezca esta variable en "__keyVault", lo cual es la convención para evitar que se confunda con una colección de usuario.

  • key_vault_namespace - El espacio de nombres en MongoDB donde se almacenarán sus DEK. Establezca esta variable con los valores de las variables key_vault_database_name y key_vault_collection_name, separadas por un punto.

  • encrypted_database_name: La base de datos en MongoDB donde se almacenarán sus datos cifrados. Establezca esta variable "medicalRecords" en.

  • encrypted_collection_name - Es la colección en MongoDB donde se almacenarán tus datos cifrados. Configure esta variable en "patients".

Puede declarar estas variables utilizando el siguiente código:

# KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local"
kms_provider_name = "<KMS provider name>"
uri = os.environ['MONGODB_URI'] # Your connection URI
key_vault_database_name = "encryption"
key_vault_collection_name = "__keyVault"
key_vault_namespace = f"{key_vault_database_name}.{key_vault_collection_name}"
encrypted_database_name = "medicalRecords"
encrypted_collection_name = "patients"

Importante

Permisos del espacio de nombres de la colección Key Vault

Para completar este tutorial, el usuario de base de datos que tu aplicación utiliza para conectar a MongoDB debe tener permisos dbAdmin en los siguientes espacios de nombres:

  • encryption.__keyVault

  • medicalRecords database

Tip

Variables de entorno

El código de muestra en este tutorial hace referencia a variables de entorno que necesitas definir. Alternativamente, puedes reemplazar los valores directamente en el código.

Para aprender cómo puede configurar estas variables de entorno, consulte el archivo README.md incluido en la aplicación de muestra en GitHub.

Tip

Variables de entorno

El código de muestra en este tutorial hace referencia a variables de entorno que necesitas definir. Alternativamente, puedes reemplazar los valores directamente en el código.

Para aprender cómo puede configurar estas variables de entorno, consulte el archivo README.md incluido en la aplicación de muestra en GitHub.

Tip

Variables de entorno

El código de muestra en este tutorial hace referencia a variables de entorno que necesitas definir. Alternativamente, puedes reemplazar los valores directamente en el código.

Para aprender cómo puede configurar estas variables de entorno, consulte el archivo README.md incluido en la aplicación de muestra en GitHub.

Tip

Variables de entorno

El código de muestra en este tutorial hace referencia a variables de entorno que necesitas definir. Alternativamente, puedes reemplazar los valores directamente en el código.

Para aprender cómo puede configurar estas variables de entorno, consulte el archivo README.md incluido en la aplicación de muestra en GitHub.

Tip

Variables de entorno

El código de muestra en este tutorial hace referencia a variables de entorno que necesitas definir. Alternativamente, puedes reemplazar los valores directamente en el código.

Para aprender cómo puede configurar estas variables de entorno, consulte el archivo README.md incluido en la aplicación de muestra en GitHub.

Tip

Variables de entorno

El código de muestra en este tutorial hace referencia a variables de entorno que necesitas definir. Alternativamente, puedes reemplazar los valores directamente en el código.

Para aprender cómo puede configurar estas variables de entorno, consulte el archivo README.md incluido en la aplicación de muestra en GitHub.

2
  1. Crear una clave maestra de cliente

    Debe crear una clave maestra de cliente(CMK) para realizar el cifrado consultable.

    Cree una clave maestra de cliente de 96bytes y guárdela en su sistema de archivos como el archivo customer-master-key.txt:

    customerMasterKeyPath = "customer-master-key.txt";
    if (!fs.existsSync(customerMasterKeyPath)) {
    fs.writeFileSync(customerMasterKeyPath, crypto.randomBytes(96));
    }
    using var randomNumberGenerator = RandomNumberGenerator.Create();
    try
    {
    var bytes = new byte[96];
    randomNumberGenerator.GetBytes(bytes);
    var localCustomerMasterKeyBase64 = Convert.ToBase64String(bytes);
    File.WriteAllText("customer-master-key.txt", localCustomerMasterKeyBase64);
    }
    catch (Exception e)
    {
    throw new Exception("Unable to write Customer Master Key file due to the following error: " + e.Message);
    }
    key := make([]byte, 96)
    if _, err := rand.Read(key); err != nil {
    panic(fmt.Sprintf("Unable to create a random 96 byte data key: %v\n", err))
    }
    if err := os.WriteFile("customer-master-key.txt", key, 0644); err != nil {
    panic(fmt.Sprintf("Unable to write key to file: %v\n", err))
    }
    byte[] localCustomerMasterKey = new byte[96];
    new SecureRandom().nextBytes(localCustomerMasterKey);
    try (FileOutputStream stream = new FileOutputStream("customer-master-key.txt")) {
    stream.write(localCustomerMasterKey);
    // ...
    if (!existsSync("./customer-master-key.txt")) {
    try {
    writeFileSync("customer-master-key.txt", randomBytes(96));
    } catch (err) {
    throw new Error(
    `Unable to write Customer Master Key to file due to the following error: ${err}`
    );
    }
    }
    path = "customer-master-key.txt"
    file_bytes = os.urandom(96)
    with open(path, "wb") as f:
    f.write(file_bytes)

    Advertencia

    No uses un archivo de claves local en producción

    Un archivo de clave local en tu sistema de archivos es poco seguro y no se recomienda para producción. En su lugar, deberías almacenar tus llaves maestras de cliente en un sistema de gestión de claves remoto (KMS).

    Para aprender a usar una KMS remota en tu implementación de Queryable Encryption, consulta el Guía de tutoriales de Queryable Encryption.

    Tip

    Genera una llave maestra de cliente desde la línea de comandos

    Utilice el siguiente comando para generar una CMK desde un shell de Unix o PowerShell:

    • Shell de Unix/macOS:

      echo $(head -c 96 /dev/urandom | base64 | tr -d '\n')
    • Potencia Shell:

      $r=[byte[]]::new(64);$g=[System.Security.Cryptography.RandomNumberGenerator]::Create();$g.GetBytes($r);[Convert]::ToBase64String($r)

    Guarde la salida del comando anterior en un archivo llamado customer-master-key.txt.

  2. Recupere la clave maestra del cliente y especifique la configuración del proveedor KMS

    Recupere el contenido del archivo de clave maestra del cliente que generó en el paso Crear una clave maestra del cliente de esta guía.

    Pasa el valor llave maestra de cliente a los ajustes de tu proveedor de KMS. El cliente utiliza estos ajustes para descubrir la llave maestra de cliente. Configura el nombre del proveedor en local para informar al controlador que está utilizando un proveedor local de claves.

    // WARNING: Do not use a local key file in a production application
    const localMasterKey = fs.readFileSync("./customer-master-key.txt");
    kmsProviderCredentials = {
    local: {
    key: localMasterKey,
    },
    };
    // WARNING: Do not use a local key file in a production application
    var kmsProviderCredentials = new Dictionary<string, IReadOnlyDictionary<string, object>>();
    try
    {
    var localCustomerMasterKeyBase64 = File.ReadAllText("customer-master-key.txt");
    var localCustomerMasterKeyBytes = Convert.FromBase64String(localCustomerMasterKeyBase64);
    var localOptions = new Dictionary<string, object>
    {
    { "key", localCustomerMasterKeyBytes }
    };
    kmsProviderCredentials.Add(kmsProvider, localOptions);
    }
    key, err := os.ReadFile("customer-master-key.txt")
    if err != nil {
    panic(fmt.Sprintf("Could not read the Customer Master Key: %v", err))
    }
    kmsProviderCredentials := map[string]map[string]interface{}{"local": {"key": key}}
    byte[] localCustomerMasterKey = new byte[96];
    try (FileInputStream fis = new FileInputStream("customer-master-key.txt")) {
    if (fis.read(localCustomerMasterKey) < 96)
    throw new Exception("Expected to read 96 bytes from the customer master key file");
    } catch (Exception e) {
    throw new Exception("Unable to read the Customer Master Key due to the following error: " + e.getMessage());
    }
    Map<String, Object> keyMap = new HashMap<String, Object>();
    keyMap.put("key", localCustomerMasterKey);
    Map<String, Map<String, Object>> kmsProviderCredentials = new HashMap<String, Map<String, Object>>();
    kmsProviderCredentials.put("local", keyMap);
    // WARNING: Do not use a local key file in a production application
    const localMasterKey = readFileSync("./customer-master-key.txt");
    kmsProviders = {
    local: {
    key: localMasterKey,
    },
    };
    path = "./customer-master-key.txt"
    with open(path, "rb") as f:
    local_master_key = f.read()
    kms_provider_credentials = {
    "local": {
    "key": local_master_key
    },
    }
  3. Configura tus opciones de cifrado automático

    Crea un objeto autoEncryptionOptions que contiene las siguientes opciones:

    • El espacio de nombres de tu Colección de Bóvedas de Llaves

    • El objeto kmsProviderCredentials, definido en el paso anterior

    const autoEncryptionOptions = {
    keyVaultNamespace: keyVaultNamespace,
    kmsProviders: kmsProviderCredentials,
    };

    Crea un objeto AutoEncryptionOptions que contiene las siguientes opciones:

    • El espacio de nombres de tu Colección de Bóvedas de Llaves

    • El objeto kmsProviderCredentials, definido en el paso anterior

    • El objeto extraOptions, que contiene la ruta a
      su Librería compartida de cifrado automático

    Tip

    Ruta de biblioteca compartida de cifrado automático

    El valor cryptSharedLibPath debe ser la ruta absoluta a su archivo de biblioteca compartida de cifrado automático. Por ejemplo:

    • Linux: /usr/local/lib/mongo_crypt_v1.so

    • macOS:/usr/local/lib/mongo_crypt_v1.dylib

    • Windows:C:\path\to\bin\mongo_crypt_v1.dll

    Establezca esta ruta en el campo CryptSharedLibPath de su archivo appsettings.json.

    var extraOptions = new Dictionary<string, object>
    {
    { "cryptSharedLibPath", _appSettings["CryptSharedLibPath"] } // Path to your Automatic Encryption Shared Library
    };
    var autoEncryptionOptions = new AutoEncryptionOptions(
    keyVaultNamespace,
    kmsProviderCredentials,
    extraOptions: extraOptions);

    Crea un objeto AutoEncryption que contiene las siguientes opciones:

    • El espacio de nombres de tu Colección de Bóvedas de Llaves

    • El objeto kmsProviderCredentials, definido en el paso anterior

    • El objeto cryptSharedLibraryPath, que contiene la ruta a
      su Librería compartida de cifrado automático
    cryptSharedLibraryPath := map[string]interface{}{
    "cryptSharedLibPath": os.Getenv("SHARED_LIB_PATH"), // Path to your Automatic Encryption Shared Library
    }
    autoEncryptionOptions := options.AutoEncryption().
    SetKeyVaultNamespace(keyVaultNamespace).
    SetKmsProviders(kmsProviderCredentials).
    SetExtraOptions(cryptSharedLibraryPath)

    Crea un objeto AutoEncryptionSettings que contiene las siguientes opciones:

    • El espacio de nombres de tu Colección de Bóvedas de Llaves

    • El objeto kmsProviderCredentials, definido en el paso anterior

    • El objeto extraOptions, que contiene la ruta a
      su Librería compartida de cifrado automático
    Map<String, Object> extraOptions = new HashMap<String, Object>();
    extraOptions.put("cryptSharedLibPath", getEnv("SHARED_LIB_PATH")); // Path to your Automatic Encryption Shared Library
    AutoEncryptionSettings autoEncryptionSettings = AutoEncryptionSettings.builder()
    .keyVaultNamespace(keyVaultNamespace)
    .kmsProviders(kmsProviderCredentials)
    .extraOptions(extraOptions)
    .build();

    Crea un objeto autoEncryptionOptions que contiene las siguientes opciones:

    • El espacio de nombres de tu Colección de Bóvedas de Llaves

    • El objeto kmsProviders, definido en el paso anterior

    • El objeto sharedLibraryPathOptions, que contiene la ruta a
      su Librería compartida de cifrado automático
    const extraOptions = {
    cryptSharedLibPath: process.env.SHARED_LIB_PATH, // Path to your Automatic Encryption Shared Library
    };
    const autoEncryptionOptions = {
    keyVaultNamespace,
    kmsProviders,
    extraOptions,
    };

    Crea un objeto $autoEncryptionOptions que contiene las siguientes opciones:

    • El espacio de nombres de tu Colección de Bóvedas de Llaves

    • El objeto $kmsProviders, definido en el paso anterior

    Crea un objeto AutoEncryptionOpts que contiene las siguientes opciones:

    • El objeto kms_provider_credentials, definido en el paso anterior

    • El espacio de nombres de tu Colección de Bóvedas de Llaves

    • La ruta a tu librería compartida de cifrado automático

    auto_encryption_options = AutoEncryptionOpts(
    kms_provider_credentials,
    key_vault_namespace,
    crypt_shared_lib_path=os.environ['SHARED_LIB_PATH'] # Path to your Automatic Encryption Shared Library>
    )

    Crea un objeto EncryptedClientBuilder que contiene las siguientes opciones:

    • Un objeto ClientOptions

    • El espacio de nombres de tu Colección de Bóvedas de Llaves

    • El objeto kms_providers, definido en el paso anterior

    Nota

    Opciones de cifrado automático

    Las opciones de cifrado automático proporcionan información de configuración a la biblioteca compartida de cifrado automático, que modifica el comportamiento de la aplicación al acceder a campos cifrados.

    Para obtener más información sobre la biblioteca compartida de cifrado automático, consulte la página Biblioteca compartida de cifrado automático para cifrado consultable.

  4. Crear un cliente para configurar una colección cifrada

    Para crear un cliente que se utilice para cifrar y descifrar datos en tu colección, instancia un nuevo MongoClient utilizando tu URI de conexión y tus opciones de cifrado automático.

    const encryptedClient = Mongo(uri, autoEncryptionOptions);

    IMPORTANTE: Si está utilizando la versión del controlador .NET/C# 3.0 o posterior, debe agregar el siguiente código a su aplicación antes de crear una instancia de un MongoClient nuevo:

    var clientSettings = MongoClientSettings.FromConnectionString(uri);
    clientSettings.AutoEncryptionOptions = qeHelpers.GetAutoEncryptionOptions(
    keyVaultNamespace,
    kmsProviderCredentials);
    var encryptedClient = new MongoClient(clientSettings);
    encryptedClient, err := mongo.Connect(
    context.TODO(),
    options.Client().ApplyURI(uri).SetAutoEncryptionOptions(autoEncryptionOptions),
    )
    if err != nil {
    panic(fmt.Sprintf("Unable to connect to MongoDB: %v\n", err))
    }
    defer func() {
    _ = encryptedClient.Disconnect(context.TODO())
    }()
    MongoClientSettings clientSettings = MongoClientSettings.builder()
    .applyConnectionString(new ConnectionString(uri))
    .autoEncryptionSettings(autoEncryptionSettings)
    .build();
    try (MongoClient encryptedClient = MongoClients.create(clientSettings)) {
    const encryptedClient = new MongoClient(uri, {
    autoEncryption: autoEncryptionOptions,
    });
    encrypted_client = MongoClient(
    uri, auto_encryption_opts=auto_encryption_options)
  5. Especificar campos para cifrar

    Para cifrar un campo, agrégalos al esquema de cifrado. Para habilitar las consultas en un campo, agregue la propiedad "queries". Cree el esquema de cifrado como sigue:

    const encryptedFieldsMap = {
    encryptedFields: {
    fields: [
    {
    path: "patientRecord.ssn",
    bsonType: "string",
    queries: { queryType: "equality" },
    },
    {
    path: "patientRecord.billing",
    bsonType: "object",
    },
    ],
    },
    };
    var encryptedFields = new BsonDocument
    {
    {
    "fields", new BsonArray
    {
    new BsonDocument
    {
    { "keyId", BsonNull.Value },
    { "path", "record.ssn" },
    { "bsonType", "string" },
    { "queries", new BsonDocument("queryType", "equality") }
    },
    new BsonDocument
    {
    { "keyId", BsonNull.Value },
    { "path", "record.billing" },
    { "bsonType", "object" }
    }
    }
    }
    };
    encryptedFieldsMap := bson.M{
    "fields": []bson.M{
    bson.M{
    "keyId": nil,
    "path": "patientRecord.ssn",
    "bsonType": "string",
    "queries": []bson.M{
    {
    "queryType": "equality",
    },
    },
    },
    bson.M{
    "keyId": nil,
    "path": "patientRecord.billing",
    "bsonType": "object",
    },
    },
    }
    BsonDocument encryptedFieldsMap = new BsonDocument().append("fields",
    new BsonArray(Arrays.asList(
    new BsonDocument()
    .append("keyId", new BsonNull())
    .append("path", new BsonString("patientRecord.ssn"))
    .append("bsonType", new BsonString("string"))
    .append("queries", new BsonDocument()
    .append("queryType", new BsonString("equality"))),
    new BsonDocument()
    .append("keyId", new BsonNull())
    .append("path", new BsonString("patientRecord.billing"))
    .append("bsonType", new BsonString("object")))));
    const encryptedFieldsMap = {
    encryptedFields: {
    fields: [
    {
    path: "patientRecord.ssn",
    bsonType: "string",
    queries: { queryType: "equality" },
    },
    {
    path: "patientRecord.billing",
    bsonType: "object",
    },
    ],
    },
    };
    encrypted_fields_map = {
    "fields": [
    {
    "path": "patientRecord.ssn",
    "bsonType": "string",
    "queries": [{"queryType": "equality"}]
    },
    {
    "path": "patientRecord.billing",
    "bsonType": "object",
    }
    ]
    }

    Nota

    En el ejemplo de código anterior, los campos "ssn" y "facturación" están cifrados, pero solo se puede consultar el campo "ssn".

  6. Crear la colección

    Instancie ClientEncryption para acceder a la API de los métodos de asistente de cifrado.

    const clientEncryption = encryptedClient.getClientEncryption()
    var clientEncryptionOptions = new ClientEncryptionOptions(
    keyVaultClient: keyVaultClient,
    keyVaultNamespace: keyVaultNamespace,
    kmsProviders: kmsProviderCredentials
    );
    var clientEncryption = new ClientEncryption(clientEncryptionOptions);
    opts := options.ClientEncryption().
    SetKeyVaultNamespace(keyVaultNamespace).
    SetKmsProviders(kmsProviderCredentials)
    clientEncryption, err := mongo.NewClientEncryption(encryptedClient, opts)
    if err != nil {
    panic(fmt.Sprintf("Unable to create a ClientEncryption instance due to the following error: %s\n", err))
    }
    ClientEncryptionSettings clientEncryptionSettings = ClientEncryptionSettings.builder()
    .keyVaultMongoClientSettings(MongoClientSettings.builder()
    .applyConnectionString(new ConnectionString(uri))
    .build())
    .keyVaultNamespace(keyVaultNamespace)
    .kmsProviders(kmsProviderCredentials)
    .build();
    ClientEncryption clientEncryption = ClientEncryptions.create(clientEncryptionSettings);
    const clientEncryption = new ClientEncryption(encryptedClient, autoEncryptionOptions);
    client_encryption = ClientEncryption(
    kms_providers=kms_provider_credentials,
    key_vault_namespace=key_vault_namespace,
    key_vault_client=encrypted_client,
    codec_options=CodecOptions(uuid_representation=STANDARD)
    )

    Debido a que estás utilizando una llave maestra de cliente local, no necesitas proporcionar las credenciales de llave maestra de cliente. Crea una variable que contenga un objeto vacío para usar en lugar de credenciales cuando crees tu colección cifrada.

    customerMasterKeyCredentials = {};
    var customerMasterKeyCredentials = new BsonDocument();
    cmkCredentials := map[string]string{}
    BsonDocument customerMasterKeyCredentials = new BsonDocument();
    customerMasterKeyCredentials = {};
    customer_master_key_credentials = {}

    Cree su colección cifrada mediante el método auxiliar de cifrado, al que se accede a través de la clase ClientEncryption. Este método genera automáticamente claves de cifrado de datos para sus campos cifrados y crea la colección cifrada:

    await clientEncryption.createEncryptedCollection(
    encryptedDatabaseName,
    encryptedCollectionName,
    {
    provider: kmsProviderName,
    createCollectionOptions: encryptedFieldsMap,
    masterKey: customerMasterKeyCredentials,
    }
    );

    La versión en C# de este tutorial usa clases separadas como modelos de datos para representar la estructura del documento. Agrega las siguientes clases Patient, PatientRecord y PatientBilling a tu proyecto:

    using MongoDB.Bson;
    using MongoDB.Bson.Serialization.Attributes;
    [BsonIgnoreExtraElements]
    public class Patient
    {
    public ObjectId Id { get; set; }
    public string Name { get; set; }
    public PatientRecord Record { get; set; }
    }
    public class PatientRecord
    {
    public string Ssn { get; set; }
    public PatientBilling Billing { get; set; }
    }
    public class PatientBilling
    {
    public string CardType { get; set; }
    public long CardNumber { get; set; }
    }

    Después de agregar estas clases, cree su colección cifrada mediante el método auxiliar de cifrado, al que se accede a través de la clase ClientEncryption. Este método genera automáticamente claves de cifrado de datos para sus campos cifrados y crea la colección cifrada:

    var createCollectionOptions = new CreateCollectionOptions<Patient>
    {
    EncryptedFields = encryptedFields
    };
    clientEncryption.CreateEncryptedCollection(patientDatabase,
    encryptedCollectionName,
    createCollectionOptions,
    kmsProviderName,
    customerMasterKeyCredentials);

    El método que crea la colección cifrada requiere una referencia a un objeto de base de datos, en lugar del nombre de la base de datos. Puede obtener esta referencia mediante un método en su objeto cliente.

    La versión en Golang de este tutorial utiliza modelos de datos para representar la estructura del documento. Añade las siguientes estructuras a tu proyecto para representar los datos en tu colección:

    type PatientDocument struct {
    PatientName string `bson:"patientName"`
    PatientID int32 `bson:"patientId"`
    PatientRecord PatientRecord `bson:"patientRecord"`
    }
    type PatientRecord struct {
    SSN string `bson:"ssn"`
    Billing PaymentInfo `bson:"billing"`
    }
    type PaymentInfo struct {
    Type string `bson:"type"`
    Number string `bson:"number"`
    }

    Después de agregar estas clases, cree su colección cifrada mediante el método auxiliar de cifrado, al que se accede a través de la clase ClientEncryption. Este método genera automáticamente claves de cifrado de datos para sus campos cifrados y crea la colección cifrada:

    createCollectionOptions := options.CreateCollection().SetEncryptedFields(encryptedFieldsMap)
    _, _, err =
    clientEncryption.CreateEncryptedCollection(
    context.TODO(),
    encryptedClient.Database(encryptedDatabaseName),
    encryptedCollectionName,
    createCollectionOptions,
    kmsProviderName,
    customerMasterKey,
    )

    El método que crea la colección cifrada requiere una referencia a un objeto de base de datos, en lugar del nombre de la base de datos. Puede obtener esta referencia mediante un método en su objeto cliente.

    Cree su colección cifrada mediante el método auxiliar de cifrado, al que se accede a través de la clase ClientEncryption. Este método genera automáticamente claves de cifrado de datos para sus campos cifrados y crea la colección cifrada:

    CreateCollectionOptions createCollectionOptions = new CreateCollectionOptions().encryptedFields(encryptedFieldsMap);
    CreateEncryptedCollectionParams encryptedCollectionParams = new CreateEncryptedCollectionParams(kmsProviderName);
    encryptedCollectionParams.masterKey(customerMasterKeyCredentials);
    try {
    clientEncryption.createEncryptedCollection(
    encryptedClient.getDatabase(encryptedDatabaseName),
    encryptedCollectionName,
    createCollectionOptions,
    encryptedCollectionParams);
    }

    El método que crea la colección cifrada requiere una referencia a un objeto de base de datos, en lugar del nombre de la base de datos. Puede obtener esta referencia mediante un método en su objeto cliente.

    Cree su colección cifrada mediante el método auxiliar de cifrado, al que se accede a través de la clase ClientEncryption. Este método genera automáticamente claves de cifrado de datos para sus campos cifrados y crea la colección cifrada:

    Nota

    Import ClientEncryption

    Al utilizar el controlador de Node.js versión 6.0 y posteriores, se debe importar ClientEncryption desde mongodb.

    Para versiones anteriores del controlador, importe ClientEncryption desde mongodb-client-encryption.

    await clientEncryption.createEncryptedCollection(
    encryptedDatabase,
    encryptedCollectionName,
    {
    provider: kmsProviderName,
    createCollectionOptions: encryptedFieldsMap,
    masterKey: customerMasterKeyCredentials,
    }
    );

    El método que crea la colección cifrada requiere una referencia a un objeto de base de datos, en lugar del nombre de la base de datos. Puede obtener esta referencia mediante un método en su objeto cliente.

    Cree su colección cifrada mediante el método auxiliar de cifrado, al que se accede a través de la clase ClientEncryption. Este método genera automáticamente claves de cifrado de datos para sus campos cifrados y crea la colección cifrada:

    client_encryption.create_encrypted_collection(
    encrypted_client[encrypted_database_name],
    encrypted_collection_name,
    encrypted_fields_map,
    kms_provider_name,
    customer_master_key_credentials,
    )

    El método que crea la colección cifrada requiere una referencia a un objeto de base de datos, en lugar del nombre de la base de datos. Puede obtener esta referencia mediante un método en su objeto cliente.

3

Cree un documento de muestra que describa la información personal de un paciente. Utilice el cliente cifrado para insertarlo en la colección patients, como se muestra en el siguiente ejemplo:

const patientDocument = {
patientName: "Jon Doe",
patientId: 12345678,
patientRecord: {
ssn: "987-65-4320",
billing: {
type: "Visa",
number: "4111111111111111",
},
},
};
const encryptedCollection = encryptedClient.getDB(encryptedDatabaseName).getCollection(encryptedCollectionName);
const insertResult = await encryptedCollection.insertOne(patientDocument);

Cree un documento de muestra que describa la información personal de un paciente. Utilice el cliente cifrado para insertarlo en la colección patients, como se muestra en el siguiente ejemplo:

var patient = new Patient
{
Name = "Jon Doe",
Id = new ObjectId(),
Record = new PatientRecord
{
Ssn = "987-65-4320",
Billing = new PatientBilling
{
CardType = "Visa",
CardNumber = 4111111111111111
}
}
};
var encryptedCollection = encryptedClient.GetDatabase(encryptedDatabaseName).
GetCollection<Patient>(encryptedCollectionName);
await encryptedCollection.InsertOneAsync(patient);

Cree un documento de muestra que describa la información personal de un paciente. Utilice el cliente cifrado para insertarlo en la colección patients, como se muestra en el siguiente ejemplo:

patientDocument := &PatientDocument{
PatientName: "John Doe",
PatientID: 12345678,
PatientRecord: PatientRecord{
SSN: "987-65-4320",
Billing: PaymentInfo{
Type: "Visa",
Number: "4111111111111111",
},
},
}
coll := encryptedClient.Database(encryptedDatabaseName).Collection(encryptedCollectionName)
_, err = coll.InsertOne(context.TODO(), patientDocument)
if err != nil {
panic(fmt.Sprintf("Unable to insert the patientDocument: %s", err))
}

Este tutorial utiliza POJOs como modelos de datos para representar la estructura del documento. Para configurar tu aplicación para que use POJOs, agrega el siguiente código:

CodecProvider pojoCodecProvider = PojoCodecProvider.builder().automatic(true).build();
CodecRegistry pojoCodecRegistry = fromRegistries(getDefaultCodecRegistry(), fromProviders(pojoCodecProvider));

Para obtener más información sobre los POJOs de Java, consulta el artículo de Wikipedia sobre Plain Old Java Object..

Este tutorial utiliza los siguientes POJO:

  • Patient

  • PatientRecord

  • PatientBilling

Puedes ver estas clases en el paquete de modelos de la aplicación Java completa.

Agregue estas clases POJO a su aplicación. Luego, cree una instancia de un Patient que describa la información personal de un paciente. Utilice el cliente cifrado para insertarlo en la colección patients, como se muestra en el siguiente ejemplo:

MongoDatabase encryptedDb = encryptedClient.getDatabase(encryptedDatabaseName).withCodecRegistry(pojoCodecRegistry);
MongoCollection<Patient> collection = encryptedDb.getCollection(encryptedCollectionName, Patient.class);
PatientBilling patientBilling = new PatientBilling("Visa", "4111111111111111");
PatientRecord patientRecord = new PatientRecord("987-65-4320", patientBilling);
Patient patientDocument = new Patient("Jon Doe", patientRecord);
InsertOneResult result = collection.insertOne(patientDocument);

Cree un documento de muestra que describa la información personal de un paciente. Utilice el cliente cifrado para insertarlo en la colección patients, como se muestra en el siguiente ejemplo:

const patientDocument = {
patientName: "Jon Doe",
patientId: 12345678,
patientRecord: {
ssn: "987-65-4320",
billing: {
type: "Visa",
number: "4111111111111111",
},
},
};
const encryptedCollection = encryptedClient
.db(encryptedDatabaseName)
.collection(encryptedCollectionName);
const result = await encryptedCollection.insertOne(patientDocument);

Cree un documento de muestra que describa la información personal de un paciente. Utilice el cliente cifrado para insertarlo en la colección patients, como se muestra en el siguiente ejemplo:

patient_document = {
"patientName": "Jon Doe",
"patientId": 12345678,
"patientRecord": {
"ssn": "987-65-4320",
"billing": {
"type": "Visa",
"number": "4111111111111111",
},
},
}
encrypted_collection = encrypted_client[encrypted_database_name][encrypted_collection_name]
result = encrypted_collection.insert_one(patient_document)
4

El siguiente código de muestra ejecuta una consulta de query en un campo cifrado e imprime los datos descifrados:

const findResult = await encryptedCollection.findOne({
"patientRecord.ssn": "987-65-4320",
});
console.log(findResult);
var ssnFilter = Builders<Patient>.Filter.Eq("patientRecord.ssn", patient.PatientRecord.Ssn);
var findResult = await encryptedCollection.Find(ssnFilter).FirstOrDefaultAsync();
Console.WriteLine(findResult.ToJson());
var findResult PatientDocument
err = coll.FindOne(
context.TODO(),
bson.M{"patientRecord.ssn": "987-65-4320"},
).Decode(&findResult)
Patient findResult = collection.find(
new BsonDocument()
.append("patientRecord.ssn", new BsonString("987-65-4320")))
.first();
System.out.println(findResult);
const findResult = await encryptedCollection.findOne({
"patientRecord.ssn": "987-65-4320",
});
console.log(findResult);
find_result = encrypted_collection.find_one({
"patientRecord.ssn": "987-65-4320"
})
print(find_result)

La salida del ejemplo de código anterior debería verse similar a la siguiente:

{
"_id": {
"$oid": "648b384a722cb9b8392df76a"
},
"name": "Jon Doe",
"record": {
"ssn": "987-65-4320",
"billing": {
"type": "Visa",
"number": "4111111111111111"
}
},
"__safeContent__": [
{
"$binary": {
"base64": "L1NsYItk0Sg+oL66DBj6IYHbX7tveANQyrU2cvMzD9Y=",
"subType": "00"
}
}
]
}

Advertencia

No modifique el campo __safeContent__

El campo __safeContent__ es esencial para Queryable Encryption. No modifiques el contenido de este campo.

Para ver un tutorial sobre cifrado consultable listo para producción con un KMS remoto, consulte Tutoriales de cifrado consultable.

Para saber cómo funciona el cifrado consultable, consulte Fundamentos del cifrado consultable.

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

  • Obtenga más información sobre los componentes de cifrado consultable en la página de Referencia.

  • Obtenga información sobre cómo funcionan las claves maestras del cliente y las claves de cifrado de datos en la página Claves y bóvedas de claves.

  • Mira cómo los Proveedores de KMS gestionan tus claves de Encriptación Consultable en la página Proveedores de KMS.

Volver

Instalar un controlador

En esta página