Descriptografar Dados Durante a Importação do Serviço 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 é ú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 se aplica aos 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ó se aplica aos arquivos do serviço Object Storage.

  • DBMS_CLOUD.COPY_COLLECTION

Tópicos

Descriptografar e carregar dados com algoritmos DBMS_CRYPTO

Mostra as etapas para decriptografar arquivos criptografados do serviço 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 carregado no Cloud Object Storage.

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

Consulte DBMS_CRYPTO Observações Operacionais 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 serviço Object Storage:

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

    Consulte Estabelecer Conexão com o Autonomous Database para obter mais informações.

  2. Armazene a sua 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 Procedures para obter mais informações.

    Não será necessário criar uma credencial para acessar o Oracle Cloud Infrastructure Object Store se você ativar as credenciais do controlador de recursos. Consulte Usar o Controlador de Recursos para Acessar Recursos da Oracle Cloud Infrastructure para obter mais informações.

  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 que você especifica 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 Procedures 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. Os dados são entã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 é o namespace do Oracle Cloud Infrastructure Object Storage e bucketname é o 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 ProcedimentoCOPY_DATA.

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

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 carregado no Cloud Object Storage.

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

Consulte DBMS_CRYPTO Observações Operacionais 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 serviço Object Storage:

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

    Consulte Estabelecer Conexão com o Autonomous Database para obter mais informações.

  2. Armazene a sua 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 Procedures para obter mais informações.

    Não será necessário criar uma credencial para acessar o Oracle Cloud Infrastructure Object Store se você ativar as credenciais do controlador de recursos. Consulte Usar o Controlador de Recursos para Acessar Recursos da Oracle Cloud Infrastructure para obter mais informações.

  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 e 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. Os dados são entã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 é o namespace do Oracle Cloud Infrastructure Object Storage e bucketname é o 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 ProcedimentoCOPY_DATA.

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