Decriptografar Dados Durante a Importação do Object Storage

Você pode decriptografar e carregar dados de arquivos criptografados armazenados no Object Storage. Você também pode decriptografar dados criptografados no Object Storage que usa em uma tabela externa.

Essa opção será útil ao migrar de um banco de dados local para um Autonomous Database se os dados em seus arquivos de origem forem criptografados.
Observação

Essa opção só é suportada para arquivos do serviço Object Storage com menos de 4 GB.

Essa opção é aplicável para os seguintes procedimentos:

  • 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, essa opção só é aplicável aos arquivos do Object Storage.

  • DBMS_CLOUD.COPY_COLLECTION

Tópicos

Decriptografar e Carregar Dados Usando Algoritmos DBMS_CRYPTO

Mostra as etapas para decriptografar arquivos criptografados do Object Storage e carregar os dados em uma tabela no Autonomous Database (a etapa de decriptografia usa algoritmos DBMS_CRYPTO).

Como pré-requisito, você deve ter arquivos criptografados e fazer upload dos arquivos no Object Storage. Este exemplo usa um arquivo CSV e presume-se que o arquivo seja criptografado usando o algoritmo DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5 e submetido a upload para o Cloud Object Storage.

Consulte Função CRIPTOGRAFIA para obter mais informações sobre a função ENCRYPT.

Consulte DBMS_CRYPTO Operational Notes para obter mais informações sobre como gerar uma chave de criptografia.

Para decriptografar e carregar dados em uma tabela existente no Autonomous Database do Object Storage:

  1. Conecte-se à instância do Autonomous Database.

    Consulte Conectar-se ao Autonomous Database para obter mais informações.

  2. Armazene a credencial do Cloud Object Storage usando DBMS_CLOUD.CREATE_CREDENTIAL.

    Por exemplo:

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

    Os valores fornecidos para username e password dependem do serviço de Cloud Object Storage que você está usando.

    Consulte CREATE_CREDENTIAL Procedimento para obter mais informações.

    A criação de uma credencial para acessar o Oracle Cloud Infrastructure Object Store não será necessária se você ativar as credenciais do controlador de recursos. Para obter mais informações, consulte Usar o Controlador de Recursos para Acessar Recursos do Oracle Cloud Infrastructure.

  3. Crie uma credencial para armazenar a chave usando DBMS_CLOUD.CREATE_CREDENTIAL. Por exemplo:
    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL (
        credential_name => 'ENC_CRED_NAME',
        username        => 'Any_username',
        password        => 'password'
      );
    END;
    /

    Como alternativa, você pode criar credenciais para armazenar a chave em um vault. Por exemplo:

    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;
    /
    Observação

    O parâmetro username especificado na credencial que armazena a chave pode ser qualquer string.

    Isso cria a credencial ENC_CRED_NAME, que é uma credencial secreta do vault, na qual o segredo (chave de decriptografia/criptografia) é armazenado como segredo no Oracle Cloud Infrastructure Vault.

    Consulte CREATE_CREDENTIAL Procedimento para obter mais informações.

  4. Execute DBMS_CLOUD.COPY_DATA e especifique o algoritmo de criptografia DBMS_CRYPTO como método de decriptografia.
    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/namespace-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;
    /

    Isso decriptografa o arquivo ENCRYPTED.CSV no Object Storage. Em seguida, os dados são carregados na tabela CSV_COPY_DATA. O valor da opção encryption do parâmetro format especifica um algoritmo de criptografia DBMS_CRYPTO a ser usado para decriptografar dados.

    Consulte DBMS_CRYPTO Algoritmos para obter mais informações sobre algoritmos de criptografia.

    Neste exemplo, namespace-string corresponde ao namespace do armazenamento de objetos do Oracle Cloud Infrastructure e bucketname corresponde ao nome do bucket. Consulte Noções Básicas de Namespaces do serviço Object Storage para obter mais informações.

    Para obter informações detalhadas sobre os parâmetros, consulte Procedimento COPY_DATA.

    Para obter informações detalhadas sobre os parâmetros format disponíveis, você pode usar com DBMS_CLOUD.COPY_DATA, consulte Opções de Formato do Pacote DBMS_CLOUD.

Decriptografar e Carregar Dados com uma Função Definida pelo Usuário

Mostra as etapas para decriptografar arquivos no Object Storage e carregar os dados em tabelas usando uma função de decriptografia definida pelo usuário.

Como pré-requisito para essas etapas, você deve ter arquivos criptografados e fazer upload dos arquivos no Object Storage. Este exemplo usa um arquivo CSV e presume-se que o arquivo seja criptografado usando o algoritmo DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5 e submetido a upload para o Cloud Object Storage.

Consulte Função CRIPTOGRAFIA para obter mais informações sobre a função ENCRYPT.

Consulte DBMS_CRYPTO Operational Notes para obter mais informações sobre como gerar uma chave de criptografia.

Para decriptografar e carregar dados em uma tabela existente no Autonomous Database do Object Storage:

  1. Conecte-se à instância do Autonomous Database.

    Consulte Conectar-se ao Autonomous Database para obter mais informações.

  2. Armazene a credencial do Cloud Object Storage usando DBMS_CLOUD.CREATE_CREDENTIAL.

    Por exemplo:

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

    Os valores fornecidos para username e password dependem do serviço de Cloud Object Storage que você está usando.

    Consulte CREATE_CREDENTIAL Procedimento para obter mais informações.

    A criação de uma credencial para acessar o Oracle Cloud Infrastructure Object Store não será necessária se você ativar as credenciais do controlador de recursos. Para obter mais informações, consulte Usar o Controlador de Recursos para Acessar Recursos do Oracle Cloud Infrastructure.

  3. Crie uma função de callback de decriptografia de função definida pelo usuário.

    Por exemplo:

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

    Isso cria a função de decriptografia DECRYPTION_FUNC. Esta função decriptografa dados usando uma cifra de fluxo ou bloco com uma chave fornecida pelo usuário. A chave fornecida pelo usuário no exemplo é armazenada no Oracle Cloud Infrastructure Vault e recuperada dinamicamente fazendo uma chamada REST para o serviço Oracle Cloud Infrastructure Vault.

  4. Execute DBMS_CLOUD.COPY_DATA, especifique a opção format encryption e especifique a função definida pelo usuário que você criou para decriptografar os dados.
    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/namespace-string/b/bucketname/o/encrypted.csv',
        format          => json_object(
                             'type' value 'csv',
                             'encryption' value json_object('user_defined_function' value 'admin.decryption_func'))
      );
    end;
    /

    Isso decriptografa o arquivo ENCRYPTED.CSV no Object Storage. Em seguida, os dados são carregados na tabela CSV_COPY_DATA. O valor da opção encryption do parâmetro format especifica um nome de função definido pelo usuário a ser usado para decriptografar dados.

    Observação

    Você deve ter o privilégio EXECUTE na função definida pelo usuário.

    Neste exemplo, namespace-string corresponde ao namespace do armazenamento de objetos do Oracle Cloud Infrastructure e bucketname corresponde ao nome do bucket. Consulte Noções Básicas de Namespaces do serviço Object Storage para obter mais informações.

    Para obter informações detalhadas sobre os parâmetros, consulte Procedimento COPY_DATA.

    Para obter informações detalhadas sobre os parâmetros format disponíveis, você pode usar com DBMS_CLOUD.COPY_DATA, consulte Opções de Formato do Pacote DBMS_CLOUD.