Descifrar datos durante la importación desde Object Storage

Puede descifrar y cargar datos de archivos cifrados almacenados en Object Storage. También puede descifrar los datos cifrados en Object Storage que utilice en una tabla externa.

Esta opción es útil al migrar de una base de datos local a una instancia de Autonomous Database si los datos de los archivos de origen están cifrados.
Nota

Esta opción solo está soportada para archivos de Object Storage de menos de 4 GB.

Esta opción se aplica a los siguientes procedimientos:

  • DBMS_CLOUD.COPY_DATA

  • DBMS_CLOUD.CREATE_EXTERNAL_TABLE

  • DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE

  • DBMS_CLOUD.CREATE_HYBRID_PART_TABLE

    Para DBMS_CLOUD.CREATE_HYBRID_PART_TABLE, esta opción solo se aplica a los archivos de Object Storage.

  • DBMS_CLOUD.COPY_COLLECTION

Temas

Descifrar y cargar datos mediante algoritmos DBMS_CRYPTO

Muestra los pasos para descifrar archivos cifrados de Object Storage y cargar los datos en una tabla de Autonomous Database (el paso de descifrado utiliza algoritmos DBMS_CRYPTO).

Como requisito, debe tener archivos cifrados y cargados los archivos en Object Storage. En este ejemplo se utiliza un archivo CSV y se supone que el archivo se cifra mediante el algoritmo DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5 y se carga en Cloud Object Storage.

Consulte Función ENCRYPT para obtener más información sobre la función ENCRYPT.

Consulte las DBMS_CRYPTO Notas operativas para obtener más información sobre la generación de una clave de cifrado.

Para descifrar y cargar datos en una tabla existente en Autonomous Database desde Object Storage:

  1. Conéctese a la instancia de Autonomous Database.

    Consulte Conexión a Autonomous Database para obtener más información.

  2. Store la credencial de Cloud Object Storage mediante DBMS_CLOUD.CREATE_CREDENTIAL.

    Por ejemplo:

    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'OBJ_STORE_CRED',
        username        => 'user1@example.com',
        password        => 'password'
      );
    END;
    /

    Los valores que proporcione para username y password dependen del servicio de Cloud Object Storage que utilice.

    Consulte Procedimiento CREATE_CREDENTIAL para obtener más información.

    La creación de una credencial para acceder al almacén de objetos de Oracle Cloud Infrastructure no es necesaria si activa las credenciales de la entidad de recurso. Consulte Uso de la principal de recurso para acceder a los recursos de Oracle Cloud Infrastructure para obtener más información.

  3. Cree una credencial para almacenar la clave mediante DBMS_CLOUD.CREATE_CREDENTIAL. Por ejemplo:
    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL (
        credential_name => 'ENC_CRED_NAME',
        username        => 'Any_username',
        password        => 'password'
      );
    END;
    /

    Como alternativa, puede crear credenciales para almacenar la clave en un almacén. Por ejemplo:

    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL (
        credential_name  => 'ENC_CRED_NAME',
        params           => JSON_OBJECT ('username' value 'Any_username',
                                         'region'    value 'Region',
                                         'secret_id' value 'Secret_id_value'));
    END;
    /
    Nota

    El parámetro username que especifique en la credencial que almacena la clave puede ser cualquier cadena.

    Esto crea la credencial ENC_CRED_NAME, que es una credencial secreta de almacén, donde el secreto (clave de descifrado/descifrado) se almacena como secreto en Oracle Cloud Infrastructure Vault.

    Consulte Procedimiento CREATE_CREDENTIAL para obtener más información.

  4. Ejecute DBMS_CLOUD.COPY_DATA y especifique el algoritmo de cifrado DBMS_CRYPTO como método de descifrado.
    BEGIN
     DBMS_CLOUD.COPY_DATA (
       table_name       => 'CSV_COPY_DATA',
       credential_name  => 'OCI$RESOURCE_PRINCIPAL',
       file_uri_list    => 'https://objectstorage.us-phoenix-1.oraclecloud.com/n/namepace-string/b/bucketname/o/encrypted.csv',
       format           => json_object( 'type' value 'csv', 'encryption' value json_object('type' value DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5,'credential_name' value 'ENC_CRED_NAME'))
      );
    END;
    /

    De esta forma se descifra el archivo ENCRYPTED.CSV en Object Storage. A continuación, los datos se cargan en la tabla CSV_COPY_DATA. El valor de la opción encryption del parámetro format especifica un algoritmo de cifrado DBMS_CRYPTO que se utilizará para descifrar los datos.

    Consulte DBMS_CRYPTO Algorithms para obtener más información sobre los algoritmos de cifrado.

    En este ejemplo, namespace-string es el espacio de nombres de almacenamiento de objetos de Oracle Cloud Infrastructure, y bucketname es el nombre del cubo. Consulte Descripción de los espacios de nombres de Object Storage para obtener más información.

    Para obtener información detallada sobre los parámetros, consulte Procedimiento COPY_DATA.

    Para obtener información detallada sobre los parámetros format disponibles, puede utilizarlos con DBMS_CLOUD.COPY_DATA, consulte DBMS_CLOUD Package Format Options.

Descifrar y cargar datos con una función definida por el usuario

Muestra los pasos para descifrar archivos en Object Storage y cargar los datos en tablas mediante una función de descifrado definida por el usuario.

Como requisito para estos pasos, debe tener archivos cifrados y cargados en Object Storage. En este ejemplo se utiliza un archivo CSV y se supone que el archivo se cifra mediante el algoritmo DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5 y se carga en Cloud Object Storage.

Consulte Función ENCRYPT para obtener más información sobre la función ENCRYPT.

Consulte las DBMS_CRYPTO Notas operativas para obtener más información sobre la generación de una clave de cifrado.

Para descifrar y cargar datos en una tabla existente en Autonomous Database desde Object Storage:

  1. Conéctese a la instancia de Autonomous Database.

    Consulte Conexión a Autonomous Database para obtener más información.

  2. Store la credencial de Cloud Object Storage mediante DBMS_CLOUD.CREATE_CREDENTIAL.

    Por ejemplo:

    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'OBJ_STORE_CRED',
        username        => 'user1@example.com',
        password        => 'password'
      );
    END;
    /

    Los valores que proporcione para username y password dependen del servicio de Cloud Object Storage que utilice.

    Consulte Procedimiento CREATE_CREDENTIAL para obtener más información.

    La creación de una credencial para acceder al almacén de objetos de Oracle Cloud Infrastructure no es necesaria si activa las credenciales de la entidad de recurso. Consulte Uso de la principal de recurso para acceder a los recursos de Oracle Cloud Infrastructure para obtener más información.

  3. Cree una función de devolución de llamada de descifrado de función definida por usuario.

    Por ejemplo:

    CREATE OR REPLACE FUNCTION decryption_func (data IN BLOB)
    RETURN BLOB
    IS
      l_decrypted_data     BLOB;
      response             DBMS_CLOUD_TYPES.resp;
      l_response_json      JSON_ARRAY_T;
      l_response_json_obj  JSON_OBJECT_T;
      l_secret_id          VARCHAR2(4000) := '<secret_ocid>';
      l_key                VARCHAR2(4000);
    BEGIN
       response := DBMS_CLOUD.send_request (
                    credential_name => 'OCI$RESOURCE_PRINCIPAL',
                    uri             => 'https://objectstorage.us-phoenix-1.oraclecloud.com/n/namepace-string/b/bucketname/o/' || l_secret_id,
                    method          => 'GET');
      l_response_json_obj := JSON_OBJECT_T.parse (DBMS_CLOUD.get_response_text(response));
      l_key := UTL_RAW.cast_to_varchar2 (UTL_ENCODE.base64_decode(UTL_RAW.cast_to_raw (l_response_json_obj.get_object('secretBundleContent').get_string('content'))));
     
      DBMS_LOB.createtemporary (l_decrypted_data, TRUE, DBMS_LOB.CALL);
      DBMS_CRYPTO.decrypt (
          dst => l_decrypted_data,
          src => data,
          typ => DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5,
          key => l_key
        );
      RETURN l_decrypted_data;
    END decryption_func;
    /

    Esto crea la función de descifrado DECRYPTION_FUNC. Esta función descifra los datos mediante un cifrado de flujo o bloque con una clave proporcionada por el usuario. La clave proporcionada por el usuario en el ejemplo se almacena en Oracle Cloud Infrastructure Vault y se recupera dinámicamente realizando una llamada REST al servicio Oracle Cloud Infrastructure Vault.

  4. Ejecute DBMS_CLOUD.COPY_DATA, especifique la opción format encryption y especifique la función definida por el usuario que ha creado para descifrar los datos.
    BEGIN
     DBMS_CLOUD.COPY_DATA (
        table_name      => 'CSV_COPY_DATA',
        credential_name => 'OBJ_STORE_CRED',
        file_uri_list   => 'https://objectstorage.us-phoenix-1.oraclecloud.com/n/namepace-string/b/bucketname/o/encrypted.csv',
        format          => json_object(
                             'type' value 'csv',
                             'encryption' value json_object('user_defined_function' value 'admin.decryption_func'))
      );
    end;
    /

    De esta forma se descifra el archivo ENCRYPTED.CSV en Object Storage. A continuación, los datos se cargan en la tabla CSV_COPY_DATA. El valor de la opción encryption del parámetro format especifica un nombre de función definido por el usuario que se utilizará para descifrar los datos.

    Nota

    Debe tener el privilegio EXECUTE en la función definida por el usuario.

    En este ejemplo, namespace-string es el espacio de nombres de almacenamiento de objetos de Oracle Cloud Infrastructure, y bucketname es el nombre del cubo. Consulte Descripción de los espacios de nombres de Object Storage para obtener más información.

    Para obtener información detallada sobre los parámetros, consulte Procedimiento COPY_DATA.

    Para obtener información detallada sobre los parámetros format disponibles, puede utilizarlos con DBMS_CLOUD.COPY_DATA, consulte DBMS_CLOUD Package Format Options.