Decifra dati durante l'importazione dallo storage degli oggetti

Puoi decifrare e caricare i dati dai file cifrati memorizzati nello storage degli oggetti. Puoi anche decifrare i dati cifrati nello storage degli oggetti che utilizzi in una tabella esterna.

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

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

Questa opzione è applicabile alle 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

Argomenti

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 di Autonomous Database (il passo di decifrazione utilizza algoritmi DBMS_CRYPTO).

Come prerequisito è necessario disporre di file cifrati e caricare i file nello storage degli oggetti. Questo esempio utilizza 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 in Autonomous Database dallo storage degli oggetti, effettuare le operazioni riportate di seguito.

  1. Connettersi all'istanza di Autonomous Database.

    See Connect to Autonomous Database for more information.

  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 Procedure.

    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 Usa principal risorsa 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 che memorizza la chiave può essere qualsiasi stringa.

    In questo modo viene creata 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 Procedure.

  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 Algorithms.

    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 Procedure.

    Per informazioni dettagliate sui parametri format disponibili, è possibile utilizzare DBMS_CLOUD.COPY_DATA, vedere DBMS_CLOUD Package Format Options.

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. Questo esempio utilizza 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 in Autonomous Database dallo storage degli oggetti, effettuare le operazioni riportate di seguito.

  1. Connettersi all'istanza di Autonomous Database.

    See Connect to Autonomous Database for more information.

  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 Procedure.

    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 Usa principal risorsa per accedere alle risorse di Oracle Cloud Infrastructure.

  3. Creare una funzione di callback di decifrazione 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;
    /

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

    La funzione definita dall'utente deve disporre del privilegio EXECUTE.

    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 Procedure.

    Per informazioni dettagliate sui parametri format disponibili, è possibile utilizzare DBMS_CLOUD.COPY_DATA, vedere DBMS_CLOUD Package Format Options.