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.

Seleccione el idioma de su controlador en el menú desplegable de la derecha para aprender a crear una aplicación que encripte y desencripte automáticamente los campos de documentos.

Nota

MongoDB Community Edition No admite el cifrado consultable con cifrado automático. Debe usar MongoDB Atlas o MongoDB Enterprise Advanced para implementar esta aplicación de ejemplo.

Importante

No utilice 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.

Advertencia

Problema conocido de MongoDB 8.2

Versión 8.2.0 de mongocryptd Es posible que no funcione en Windows. Este error afecta al cifrado en uso con el controlador MongoDB.NET/C# y podría afectar a otros controladores según los mongocryptd argumentos de generación.

Para obtener más información sobre este problema y cómo resolverlo, consulte Problemas conocidos en las 8.2 Notas de la versión de MongoDB.

Para completar y ejecutar el código de esta guía, debe configurar su entorno de desarrollo como se muestra en la página Instalar un controlador compatible con cifrado consultable y dependencias.

Para ver el código completo de la aplicación de muestra, seleccione su lenguaje de programación en el selector de lenguaje.

1

Los ejemplos de código de este tutorial utilizan las siguientes variables para realizar el flujo de trabajo de cifrado consultable:

  • kmsProviderName: el KMS que utiliza para almacenar su clave maestra de cliente. Establezca esta variable en "local" para este tutorial.

  • uri: la URI de conexión de su implementación de MongoDB. Establezca la URI de conexión en la MONGODB_URI variable de entorno o reemplace el valor directamente.

  • 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 sus DEK. Establezca esta variable "__keyVault" en, que es la convención para evitar que se confunda con una colección de usuario.

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

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

  • encryptedCollectionName: La colección en MongoDB donde se almacenarán sus datos cifrados. Establezca esta variable "patients" en.

Puede declarar estas variables utilizando el siguiente código:

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 claves de cifrado de datos (DEK). Establezca el valor de keyVaultDatabaseName "encryption"en.

  • keyVaultCollectionName: La colección en MongoDB donde se almacenarán sus DEK. Establezca esta variable "__keyVault" en, que es la convención para evitar que se confunda con una colección de usuario.

  • keyVaultNamespace: El espacio de nombres en MongoDB donde se almacenarán sus DEK. Establezca keyVaultNamespace como un nuevo CollectionNamespace objeto cuyo nombre contenga los valores de las keyVaultDatabaseName keyVaultCollectionName variables y, separados 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: la URI de conexión de su implementación de MongoDB. Establezca la URI de conexión en el appsettings.json archivo o reemplace el valor directamente.

Puede declarar estas variables utilizando el siguiente código:

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 utiliza para almacenar su clave maestra de cliente. Establezca esta variable en "local" para este tutorial.

  • uri: la URI de conexión de su implementación de MongoDB. Establezca la URI de conexión en la MONGODB_URI variable de entorno o reemplace el valor directamente.

  • 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 sus DEK. Establezca esta variable "__keyVault" en, que es la convención para evitar que se confunda con una colección de usuario.

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

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

  • encryptedCollectionName: La colección en MongoDB donde se almacenarán sus datos cifrados. Establezca esta variable "patients" en.

Puede declarar estas variables utilizando el siguiente código:

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 utiliza para almacenar su clave maestra de cliente. Establezca esta variable en "local" para este tutorial.

  • uri: la URI de conexión de su implementación de MongoDB. Establezca la URI de conexión en la MONGODB_URI variable de entorno o reemplace el valor directamente.

  • 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 sus DEK. Establezca esta variable "__keyVault" en, que es la convención para evitar que se confunda con una colección de usuario.

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

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

  • encryptedCollectionName: La colección en MongoDB donde se almacenarán sus datos cifrados. Establezca esta variable "patients" en.

Puede declarar estas variables utilizando el siguiente código:

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 utiliza para almacenar su clave maestra de cliente. Establezca esta variable en "local" para este tutorial.

  • uri: la URI de conexión de su implementación de MongoDB. Establezca la URI de conexión en la MONGODB_URI variable de entorno o reemplace el valor directamente.

  • 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 sus DEK. Establezca esta variable "__keyVault" en, que es la convención para evitar que se confunda con una colección de usuario.

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

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

  • encryptedCollectionName: La colección en MongoDB donde se almacenarán sus datos cifrados. Establezca esta variable "patients" en.

Puede declarar estas variables utilizando el siguiente código:

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. Establezca el valor de su variable de KMS_PROVIDER entorno en 'local' para este tutorial.

  • $uri: la URI de conexión de su implementación de MongoDB. Establezca la URI de conexión en la MONGODB_URI variable de entorno.

  • $keyVaultDatabaseName: La base de datos en MongoDB donde se almacenarán sus claves de cifrado de datos (DEK). Establezca el valor de $keyVaultDatabaseName 'encryption'en.

  • $keyVaultCollectionName - La colección de MongoDB donde se almacenarán tus DEK. Establece esta variable en '__keyVault', que es la convención para ayudar a evitar confundirla con una colección de usuario.

  • $keyVaultNamespace: El espacio de nombres en MongoDB donde se almacenarán sus DEK. Establezca esta variable con los valores de las $keyVaultDatabaseName $keyVaultCollectionName variables y, separados por un punto.

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

  • $encryptedCollectionName: La colección en MongoDB donde se almacenarán sus datos cifrados. Establezca esta variable 'patients' en.

Puede declarar estas variables utilizando el siguiente código:

$kmsProviderName = getenv('KMS_PROVIDER');
$uri = getenv('MONGODB_URI'); // Your connection URI
$keyVaultDatabaseName = 'encryption';
$keyVaultCollectionName = '__keyVault';
$keyVaultNamespace = $keyVaultDatabaseName . '.' . $keyVaultCollectionName;
$encryptedDatabaseName = 'medicalRecords';
$encryptedCollectionName = 'patients';
  • kms_provider_name: El KMS que utiliza para almacenar su clave maestra de cliente. Establezca esta variable en "local" para este tutorial.

  • uri: la URI de conexión de su implementación de MongoDB. Establezca la URI de conexión en la MONGODB_URI variable de entorno o reemplace el valor directamente.

  • 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 sus DEK. Establezca esta variable "__keyVault" en, que 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 key_vault_database_name key_vault_collection_name variables y, separados 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: La colección en MongoDB donde se almacenarán sus datos cifrados. Establezca esta variable "patients" en.

Puede declarar estas variables utilizando el siguiente código:

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"
  • kms_provider_name: El KMS que utiliza para almacenar su clave maestra de cliente. Establezca esta variable en "local" para este tutorial.

  • uri: la URI de conexión de su implementación de MongoDB. Establezca la URI de conexión en la MONGODB_URI variable de entorno.

  • 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 sus DEK. Establezca esta variable "__keyVault" en, que 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 en una Namespace estructura y pase los valores de las key_vault_database_name key_vault_collection_name variables y.

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

  • encrypted_collection_name: La colección en MongoDB donde se almacenarán sus datos cifrados. Establezca esta variable "patients" en.

Puede declarar estas variables utilizando el siguiente código:

let kms_provider_name = "<KMS provider name>";
let uri = env::var("MONGODB_URI").expect("Set MONGODB_URI environment variable to your connection string");
let key_vault_database_name = "encryption";
let key_vault_collection_name = "__keyVault";
let key_vault_namespace = Namespace::new(key_vault_database_name, key_vault_collection_name);
let encrypted_database_name = "medicalRecords";
let encrypted_collection_name = "patients";

Importante

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

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

  • encryption.__keyVault

  • medicalRecords database

Tip

Variables de entorno

El código de ejemplo de este tutorial hace referencia a las variables de entorno que debe configurar. También puede reemplazar los valores directamente en el código.

Para saber cómo 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 ejemplo de este tutorial hace referencia a las variables de entorno que debe configurar. También puede reemplazar los valores directamente en el código.

Para saber cómo 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 ejemplo de este tutorial hace referencia a las variables de entorno que debe configurar. También puede reemplazar los valores directamente en el código.

Para saber cómo 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 ejemplo de este tutorial hace referencia a las variables de entorno que debe configurar. También puede reemplazar los valores directamente en el código.

Para saber cómo 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 ejemplo de este tutorial hace referencia a las variables de entorno que debe configurar. También puede reemplazar los valores directamente en el código.

Para saber cómo 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 ejemplo de este tutorial hace referencia a las variables de entorno que debe configurar. También puede reemplazar los valores directamente en el código.

Para saber cómo 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 ejemplo de este tutorial hace referencia a las variables de entorno que debe configurar. También puede reemplazar los valores directamente en el código.

Para saber cómo 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 ejemplo de este tutorial hace referencia a las variables de entorno que debe configurar. También puede reemplazar los valores directamente en el código.

Para saber cómo 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);
    File.WriteAllBytes("customer-master-key.txt", bytes);
    }
    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}`
    );
    }
    }
    if (!file_exists('./customer-master-key.txt')) {
    file_put_contents('./customer-master-key.txt', random_bytes(96));
    }
    path = "customer-master-key.txt"
    file_bytes = os.urandom(96)
    with open(path, "wb") as f:
    f.write(file_bytes)
    let key_file_path = "customer-master-key.txt";
    let mut local_key = Vec::new();
    if !Path::new(key_file_path).exists() {
    let mut key = [0u8; 96];
    rand::thread_rng().fill_bytes(&mut key);
    // Write the key to the file
    match OpenOptions::new().write(true).create(true).open(key_file_path) {
    Ok(mut file) => {
    if let Err(err) = file.write_all(&key) {
    panic!("Unable to write Customer Master Key to file: {}", err);
    }
    }
    Err(err) => panic!("Unable to create Customer Master Key file: {}", err),
    }
    local_key = key.to_vec();
    }

    Además de las cadenas de bytes, también puedes utilizar una cadena codificada en Base64como clave local.

    Advertencia

    Proteja su archivo de clave local en producción

    Recomendamos almacenar sus claves maestras de cliente en un sistema de gestión de claves (KMS) remoto. Para aprender a usar un KMS remoto en su implementación de cifrado consultable, consulte la guía "Tutoriales de cifrado consultable".

    Si decide usar un proveedor de claves local en producción, tenga mucho cuidado y no lo almacene en el sistema de archivos. Considere inyectar la clave en su aplicación cliente mediante un proceso sidecar o utilice otro método que la mantenga segura.

    Tip

    Generar una CMK 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 | tr -d '\n')
    • Potencia Shell:

      $r=[byte[]]::new(96);$g=[System.Security.Cryptography.RandomNumberGenerator]::Create();$g.GetBytes($r);$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.

    Utilice el valor de CMK en la configuración de su proveedor de KMS. El cliente utiliza esta configuración para descubrir la CMK. Configure el nombre del proveedor como local para indicar que utiliza un proveedor de claves local.

    // WARNING: Do not use a local key file in a production application
    const localMasterKey = fs.readFileSync("./customer-master-key.txt");
    if (localMasterKey.length !== 96) {
    throw new Error(
    "Expected the customer master key file to be 96 bytes."
    );
    }
    kmsProviderCredentials = {
    local: {
    key: localMasterKey,
    },
    };

    También puede proporcionar un nombre personalizado para su proveedor de KMS. Para ello, introduzca una cadena que incluya el nombre del proveedor, seguido de dos puntos y el nombre personalizado. Al proporcionar un nombre único para un proveedor de KMS, podrá especificar varios proveedores del mismo tipo.

    El siguiente ejemplo muestra un objeto que establece el nombre del proveedor KMS en "my_kms_provider":

    {
    "local:my_kms_provider": {
    { "key" : "<local CMK>" }
    },
    }
    // WARNING: Do not use a local key file in a production application
    var kmsProviderCredentials = new Dictionary<string, IReadOnlyDictionary<string, object>>();
    try
    {
    var localCustomerMasterKeyBytes = File.ReadAllBytes("customer-master-key.txt");
    if (localCustomerMasterKeyBytes.Length != 96)
    {
    throw new Exception("Expected the customer master key file to be 96 bytes.");
    }
    var localOptions = new Dictionary<string, object>
    {
    { "key", localCustomerMasterKeyBytes }
    };
    kmsProviderCredentials.Add("local", localOptions);
    }
    key, err := os.ReadFile("customer-master-key.txt")
    if err != nil {
    panic(fmt.Sprintf("Could not read the Customer Master Key: %v", err))
    }
    if len(key) != 96 {
    panic(fmt.Sprintf("Expected the customer master key file to be 96 bytes."))
    }
    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 the customer master key file to be 96 bytes.");
    } 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);

    También puede proporcionar un nombre personalizado para su proveedor de KMS. Para ello, introduzca una cadena que incluya el nombre del proveedor, seguido de dos puntos y el nombre personalizado. Al proporcionar un nombre único para un proveedor de KMS, podrá especificar varios proveedores del mismo tipo.

    El siguiente ejemplo muestra un objeto que establece el nombre del proveedor KMS en "my_kms_provider":

    {
    "local:my_kms_provider": {
    { "key" : "<local CMK>" }
    },
    }
    // WARNING: Do not use a local key file in a production application
    const localMasterKey = readFileSync("./customer-master-key.txt");
    if (localMasterKey.length !== 96) {
    throw new Error(
    "Expected the customer master key file to be 96 bytes."
    );
    }
    kmsProviders = {
    local: {
    key: localMasterKey,
    },
    };

    También puede proporcionar un nombre personalizado para su proveedor de KMS. Para ello, introduzca una cadena que incluya el nombre del proveedor, seguido de dos puntos y el nombre personalizado. Al proporcionar un nombre único para un proveedor de KMS, podrá especificar varios proveedores del mismo tipo.

    El siguiente ejemplo muestra un objeto que establece el nombre del proveedor KMS en "my_kms_provider":

    {
    "local:my_kms_provider": {
    { "key" : "<local CMK>" }
    },
    }
    // WARNING: Do not use a local key file in a production application
    $localMasterKey = file_get_contents('./customer-master-key.txt');
    $kmsProviders = [
    'local' => [
    'key' => new \MongoDB\BSON\Binary($localMasterKey),
    ],
    ];
    path = "./customer-master-key.txt"
    with open(path, "rb") as f:
    local_master_key = f.read()
    if len(local_master_key) != 96:
    raise Exception("Expected the customer master key file to be 96 bytes.")
    kms_provider_credentials = {
    "local": {
    "key": local_master_key
    },
    }

    También puede proporcionar un nombre personalizado para su proveedor de KMS. Para ello, introduzca una cadena que incluya el nombre del proveedor, seguido de dos puntos y el nombre personalizado. Al proporcionar un nombre único para un proveedor de KMS, podrá especificar varios proveedores del mismo tipo.

    El siguiente ejemplo muestra un objeto que establece el nombre del proveedor KMS en "my_kms_provider":

    {
    "local:my_kms_provider": {
    { "key" : "<local CMK>" }
    },
    }
    {
    // WARNING: Do not use a local key file in a production application
    match fs::File::open(key_file_path) {
    Ok(mut file) => {
    if let Err(err) = file.read_to_end(&mut local_key) {
    panic!("Unable to read Customer Master Key file: {}", err);
    }
    }
    Err(err) => panic!("Unable to open Customer Master Key file: {}", err),
    }
    if local_key.len() != 96 {
    panic!("Expected the customer master key file to be 96 bytes.");
    }
    }
    let binary_key = Binary {
    subtype: BinarySubtype::Generic,
    bytes: local_key,
    };
    kms_providers = vec![(
    KmsProvider::local(),
    doc! {
    "key": binary_key,
    },
    None,
    )];
  3. Configure sus opciones de cifrado automático

    Crea un objeto autoEncryptionOptions que contenga las siguientes opciones:

    • El espacio de nombres de su colección de Key Vault

    • El objeto kmsProviderCredentials, definido en el paso anterior

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

    Crea un objeto AutoEncryptionOptions que contenga las siguientes opciones:

    • El espacio de nombres de su colección de Key Vault

    • El objeto kmsProviderCredentials, definido en el paso anterior

    • El objeto extraOptions, que contiene la ruta a
      su Librería compartida de cifrado automático
    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 contenga las siguientes opciones:

    • El espacio de nombres de su colección de Key Vault

    • 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 contenga las siguientes opciones:

    • El espacio de nombres de su colección de Key Vault

    • 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();

    Si omite keyVaultClient o establece bypassAutomaticEncryption como falso en su objeto AutoEncryptionSettings, el controlador crea un MongoClient interno independiente. La configuración interna MongoClient difiere de la configuración principal MongoClient al establecer minPoolSize como 0 y ​​omitir AutoEncryptionSettings.

    Crea un objeto autoEncryptionOptions que contenga las siguientes opciones:

    • El espacio de nombres de su colección de Key Vault

    • 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 contenga las siguientes opciones:

    • El espacio de nombres de su colección de Key Vault

    • El objeto $kmsProviders, definido en el paso anterior

    $autoEncryptionOptions = [
    'keyVaultNamespace' => $keyVaultNamespace,
    'kmsProviders' => $kmsProviders,
    ];

    Crea un objeto AutoEncryptionOpts que contenga las siguientes opciones:

    • El objeto kms_provider_credentials, definido en el paso anterior

    • El espacio de nombres de su colección de Key Vault

    • La ruta a su biblioteca 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 contenga las siguientes opciones:

    • Un objeto ClientOptions

    • El espacio de nombres de su colección de Key Vault

    • El objeto kms_providers, definido en el paso anterior

    let client_options = ClientOptions::builder().build();
    let builder = Client::encrypted_builder(
    client_options,
    key_vault_namespace.clone(),
    kms_providers.clone()
    ).expect("");

    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.

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

    Para crear un cliente utilizado para cifrar y descifrar datos en su colección, cree una instancia de un nuevo cliente utilizando su URI de conexión y sus 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:

    MongoClientSettings.Extensions.AddAutoEncryption(); // .NET/C# Driver v3.0 or later only

    Cree una instancia nueva de MongoClient mediante su URI de conexión y las opciones de cifrado automático:

    var clientSettings = MongoClientSettings.FromConnectionString(uri);
    clientSettings.AutoEncryptionOptions = qeHelpers.GetAutoEncryptionOptions(
    keyVaultNamespace,
    kmsProviderCredentials);
    var encryptedClient = new MongoClient(clientSettings);
    opts := options.Client().
    ApplyURI(uri).
    SetAutoEncryptionOptions(autoEncryptionOptions)
    encryptedClient, err := mongo.Connect(opts)
    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,
    });
    $encryptedClient = new \MongoDB\Client($uri, [], [
    'autoEncryption' => $autoEncryptionOptions,
    ]);
    encrypted_client = MongoClient(
    uri, auto_encryption_opts=auto_encryption_options)
    let encrypted_client = encrypted_client_builder
    .extra_options(Some(doc!{
    "cryptSharedLibPath": env::var("SHARED_LIB_PATH").expect("Set SHARED_LIB_PATH environment variable to path to crypt_shared library")
    }))
    .key_vault_client(Client::with_uri_str(uri).await.unwrap())
    .build()
    .await
    .unwrap();
  5. Especificar campos para cifrar

    Para cifrar un campo, añádalo al esquema de cifrado. Para habilitar las consultas en un campo, añada la propiedad queries. Cree el esquema de cifrado de la siguiente manera:

    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", "patientRecord.ssn" },
    { "bsonType", "string" },
    { "queries", new BsonDocument("queryType", "equality") }
    },
    new BsonDocument
    {
    { "keyId", BsonNull.Value },
    { "path", "patientRecord.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",
    },
    ],
    },
    };
    $encryptedFieldsMap = [
    'encryptedFields' => [
    'fields' => [
    [
    'path' => 'patientRecord.ssn',
    'bsonType' => 'string',
    'queries' => ['queryType' => 'equality'],
    'keyId' => null,
    ],
    [
    'path' => 'patientRecord.billing',
    'bsonType' => 'object',
    'keyId' => null,
    ],
    ],
    ],
    ];
    encrypted_fields_map = {
    "fields": [
    {
    "path": "patientRecord.ssn",
    "bsonType": "string",
    "queries": [{"queryType": "equality"}]
    },
    {
    "path": "patientRecord.billing",
    "bsonType": "object",
    }
    ]
    }
    let encrypted_fields_map = doc! {
    "fields": [
    {
    "path": "patientRecord.ssn",
    "bsonType": "string",
    "keyId": Bson::Null,
    "queries": { "queryType": "equality" },
    },
    {
    "path": "patientRecord.billing",
    "bsonType": "object",
    "keyId": Bson::Null,
    },
    ]
    };

    Nota

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

  6. Crear la colección

    Cree una instancia de un objeto ClientEncryption para acceder a la API para los métodos auxiliares 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
    );
    $clientEncryption = $encryptedClient->createClientEncryption($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)
    )
    let client_encryption = ClientEncryption::new(
    encrypted_client.clone(),
    key_vault_namespace.clone(),
    kms_providers.clone(),
    )
    .unwrap();

    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 = {};
    $customerMasterKeyCredentials = [];
    customer_master_key_credentials = {}
    let local_master_key = LocalMasterKey::builder().build();

    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 utiliza clases independientes como modelos de datos para representar la estructura del documento. Agregue las siguientes clases Patient, PatientRecord y PatientBilling a su proyecto:

    using MongoDB.Bson;
    using MongoDB.Bson.Serialization.Attributes;
    [BsonIgnoreExtraElements]
    public class Patient
    {
    public ObjectId Id { get; set; }
    public string PatientName { get; set; }
    public PatientRecord PatientRecord { get; set; }
    }
    public class PatientRecord
    {
    public string Ssn { get; set; }
    public PatientBilling Billing { get; set; }
    public int BillAmount { 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 Golang de este tutorial utiliza modelos de datos para representar la estructura del documento. Agregue las siguientes estructuras a su proyecto para representar los datos de su 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"`
    BillAmount int `bson:"billAmount"`
    }
    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 Node.js v6.0 y posterior, 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 llamando al método createEncryptedCollection() en su base de datos. Este método genera automáticamente claves de cifrado de datos para sus campos cifrados y crea la colección cifrada:

    $client->getDatabase($encryptedDatabase)->createEncryptedCollection(
    $encryptedCollectionName,
    $clientEncryption,
    $kmsProviderName,
    $customerMasterKeyCredentials,
    $encryptedFieldsMap,
    );

    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.

    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.database(encrypted_database_name),
    encrypted_collection_name,
    customer_master_key_credentials
    )
    .encrypted_fields(encrypted_fields_map)
    .await
    .1?;

    El método que crea la colección cifrada requiere una referencia a un objeto de base de datos en vez del nombre de la base de datos. Puedes obtener esta referencia utilizando el método database() en tu 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",
},
billAmount: 1500,
},
};
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
{
PatientName = "Jon Doe",
Id = new ObjectId(),
PatientRecord = new PatientRecord
{
Ssn = "987-65-4320",
Billing = new PatientBilling
{
CardType = "Visa",
CardNumber = 4111111111111111,
},
BillAmount = 1500
}
};
var encryptedCollection = encryptedClient.GetDatabase(encryptedDatabaseName).
GetCollection<Patient>(encryptedCollectionName);
encryptedCollection.InsertOne(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: "Jon Doe",
PatientID: 12345678,
PatientRecord: PatientRecord{
SSN: "987-65-4320",
Billing: PaymentInfo{
Type: "Visa",
Number: "4111111111111111",
},
BillAmount: 1500,
},
}
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 su aplicación para usar POJOs, agregue 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 POJO de Java, consulte el artículo de Wikipedia Plain Old Java Object.

Este tutorial utiliza los siguientes POJO:

  • Patient

  • PatientRecord

  • PatientBilling

Puede 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, 1500);
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",
},
billAmount: 1500,
},
};
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:

$patientDocument = [
'patientName' => 'Jon Doe',
'patientId' => 12345678,
'patientRecord' => [
'ssn' => '987-65-4320',
'billing' => [
'type' => 'Visa',
'number' => '4111111111111111',
],
'billAmount' => 1500,
],
];
$encryptedCollection = $encryptedClient
->getDatabase($encryptedDatabaseName)
->getCollection($encryptedCollectionName);
$result = $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",
},
"billAmount": 1500,
},
}
encrypted_collection = encrypted_client[encrypted_database_name][encrypted_collection_name]
result = encrypted_collection.insert_one(patient_document)

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:

let patient_document = doc! {
"patientName": "Jon Doe",
"patientId": 12345678,
"patientRecord": {
"ssn": "987-65-4320",
"billing": {
"type": "Visa",
"number": "4111111111111111",
},
"billAmount": 1500,
}
};
let encrypted_coll: Collection<Document> = encrypted_client
.database(encrypted_database_name)
.collection(encrypted_collection_name);
let insert_result = encrypted_coll.insert_one(patient_document).await?;
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).ToCursorAsync();
Console.WriteLine(findResult.FirstOrDefault().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);
$findResult = $encryptedCollection->findOne([
'patientRecord.ssn' => '987-65-4320',
]);
print_r($findResult);
find_result = encrypted_collection.find_one({
"patientRecord.ssn": "987-65-4320"
})
print(find_result)
let find_result = encrypted_coll.find_one(doc! {"patientRecord.ssn": "987-65-4320"}).await?;
match find_result {
Some(document) => println!("{:?}", document),
None => println!("Document not found"),
}

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"
},
"billAmount": 1500
},
"__safeContent__": [
{
"$binary": {
"base64": "L1NsYItk0Sg+oL66DBj6IYHbX7tveANQyrU2cvMzD9Y=",
"subType": "00"
}
}
]
}

Advertencia

No modifique el campo __safeContent__

El campo __safeContent__ es esencial para el cifrado consultable. No modifique su contenido.

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, consulte los siguientes enlaces:

Volver

Características

En esta página