Decifra i dati durante l'importazione dallo storage degli oggetti

Puoi decifrare e caricare i dati dai file cifrati memorizzati nello storage degli oggetti. Inoltre, puoi decifrare i dati cifrati nello storage degli oggetti che usi in una tabella esterna.

Questa opzione è utile quando si esegue la migrazione da un database in locale a un Autonomous Database se i dati nei file di origine sono cifrati.
Nota

Questa opzione è supportata solo per file di storage degli oggetti con dimensioni inferiori a 4 GB.

Questa opzione è applicabile per le seguenti procedure:

  • DBMS_CLOUD.COPY_DATA

  • DBMS_CLOUD.CREATE_EXTERNAL_TABLE

  • DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE

  • DBMS_CLOUD.CREATE_HYBRID_PART_TABLE

    Per DBMS_CLOUD.CREATE_HYBRID_PART_TABLE questa opzione è applicabile solo ai file di storage degli oggetti.

  • DBMS_CLOUD.COPY_COLLECTION

Temi

Decifra e carica dati mediante algoritmi DBMS_CRYPTO

Mostra i passi per decifrare i file cifrati dallo storage degli oggetti e caricare i dati in una tabella in Autonomous Database (il passo di decifrazione utilizza gli algoritmi DBMS_CRYPTO).

Come prerequisito, è necessario disporre di file cifrati e caricare i file nello storage degli oggetti. In questo esempio viene utilizzato un file CSV e si presume che il file venga cifrato utilizzando l'algoritmo DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5 e caricato nello storage degli oggetti cloud.

Per ulteriori informazioni sulla funzione ENCRYPT, vedere Funzione ENCRYPT.

Per ulteriori informazioni sulla generazione di una chiave di cifratura, vedere DBMS_CRYPTO Operational Notes.

Per decifrare e caricare i dati in una tabella esistente su Autonomous Database dallo storage degli oggetti, effettuare le operazioni riportate di seguito.

  1. Connettersi all'istanza di Autonomous Database.

    Per ulteriori informazioni, consulta la sezione relativa alla connessione ad Autonomous Database.

  2. Memorizzare le credenziali dello storage degli oggetti cloud utilizzando DBMS_CLOUD.CREATE_CREDENTIAL.

    Ad esempio:

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

    I valori forniti per username e password dipendono dal servizio di storage degli oggetti cloud in uso.

    Per ulteriori informazioni, vedere CREATE_CREDENTIAL Procedura.

    La creazione di una credenziale per accedere all'area di memorizzazione degli oggetti di Oracle Cloud Infrastructure non è necessaria se si abilitano le credenziali del principal risorsa. Per ulteriori informazioni, consulta la sezione relativa all'uso del principal delle risorse per accedere alle risorse di Oracle Cloud Infrastructure.

  3. Creare una credenziale per memorizzare la chiave utilizzando DBMS_CLOUD.CREATE_CREDENTIAL. Ad esempio:
    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL (
        credential_name => 'ENC_CRED_NAME',
        username        => 'Any_username',
        password        => 'password'
      );
    END;
    /

    In alternativa, è possibile creare le credenziali per memorizzare la chiave in un vault. Ad esempio:

    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

    Il parametro username specificato nella credenziale in cui è memorizzata la chiave può essere una stringa qualsiasi.

    Questa operazione crea la credenziale ENC_CRED_NAME, che è una credenziale segreta del vault, in cui il segreto (chiave di decifrazione/cifratura) viene memorizzato come segreto in Oracle Cloud Infrastructure Vault.

    Per ulteriori informazioni, vedere CREATE_CREDENTIAL Procedura.

  4. Eseguire DBMS_CLOUD.COPY_DATA e specificare l'algoritmo di cifratura DBMS_CRYPTO come metodo di decifrazione.
    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;
    /

    Questa operazione decifra il file ENCRYPTED.CSV nello storage degli oggetti. I dati vengono quindi caricati nella tabella CSV_COPY_DATA. Il valore dell'opzione encryption del parametro format specifica un algoritmo di cifratura DBMS_CRYPTO da utilizzare per decifrare i dati.

    Per ulteriori informazioni sugli algoritmi di cifratura, vedere DBMS_CRYPTO Algoritmi.

    In questo esempio, namespace-string è lo spazio di nomi dello storage degli oggetti Oracle Cloud Infrastructure e bucketname è il nome del bucket. Per ulteriori informazioni, vedere Informazioni sugli spazi di nomi dello storage degli oggetti.

    Per informazioni dettagliate sui parametri, vedere COPY_DATA Procedura.

    Per informazioni dettagliate sui parametri format disponibili, è possibile utilizzare DBMS_CLOUD.COPY_DATA, vedere DBMS_CLOUD Opzioni formato pacchetto.

Decifra e carica dati con una funzione definita dall'utente

Mostra i passi per decifrare i file nello storage degli oggetti e caricare i dati nelle tabelle utilizzando una funzione di decifrazione definita dall'utente.

Come prerequisito per questi passi, è necessario disporre di file cifrati e caricare i file nello storage degli oggetti. In questo esempio viene utilizzato un file CSV e si presume che il file venga cifrato utilizzando l'algoritmo DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5 e caricato nello storage degli oggetti cloud.

Per ulteriori informazioni sulla funzione ENCRYPT, vedere Funzione ENCRYPT.

Per ulteriori informazioni sulla generazione di una chiave di cifratura, vedere DBMS_CRYPTO Operational Notes.

Per decifrare e caricare i dati in una tabella esistente su Autonomous Database dallo storage degli oggetti, effettuare le operazioni riportate di seguito.

  1. Connettersi all'istanza di Autonomous Database.

    Per ulteriori informazioni, consulta la sezione relativa alla connessione ad Autonomous Database.

  2. Memorizzare le credenziali dello storage degli oggetti cloud utilizzando DBMS_CLOUD.CREATE_CREDENTIAL.

    Ad esempio:

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

    I valori forniti per username e password dipendono dal servizio di storage degli oggetti cloud in uso.

    Per ulteriori informazioni, vedere CREATE_CREDENTIAL Procedura.

    La creazione di una credenziale per accedere all'area di memorizzazione degli oggetti di Oracle Cloud Infrastructure non è necessaria se si abilitano le credenziali del principal risorsa. Per ulteriori informazioni, consulta la sezione relativa all'uso del principal delle risorse per accedere alle risorse di Oracle Cloud Infrastructure.

  3. Creare una funzione di callback di decifrazione della funzione definita dall'utente.

    Ad esempio:

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

    In questo modo viene creata la funzione di decifrazione DECRYPTION_FUNC. Questa funzione decifra i dati utilizzando una cifra di flusso o blocco con una chiave fornita dall'utente. La chiave fornita dall'utente nell'esempio viene memorizzata in Oracle Cloud Infrastructure Vault e viene recuperata dinamicamente effettuando una chiamata REST al servizio Oracle Cloud Infrastructure Vault.

  4. Eseguire DBMS_CLOUD.COPY_DATA e specificare l'opzione format encryption e specificare la funzione definita dall'utente creata per decifrare i dati.
    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;
    /

    Questa operazione decifra il file ENCRYPTED.CSV nello storage degli oggetti. I dati vengono quindi caricati nella tabella CSV_COPY_DATA. Il valore dell'opzione encryption del parametro format specifica un nome di funzione definito dall'utente da utilizzare per decifrare i dati.

    Nota

    È necessario disporre del privilegio EXECUTE per la funzione definita dall'utente.

    In questo esempio, namespace-string è lo spazio di nomi dello storage degli oggetti Oracle Cloud Infrastructure e bucketname è il nome del bucket. Per ulteriori informazioni, vedere Informazioni sugli spazi di nomi dello storage degli oggetti.

    Per informazioni dettagliate sui parametri, vedere COPY_DATA Procedura.

    Per informazioni dettagliate sui parametri format disponibili, è possibile utilizzare DBMS_CLOUD.COPY_DATA, vedere DBMS_CLOUD Opzioni formato pacchetto.