Décryptage des données lors de l'import à partir d'Object Storage

Vous pouvez décrypter et charger des données à partir de fichiers cryptés stockés dans Object Storage. Vous pouvez également décrypter les données cryptées sur Object Storage que vous utilisez dans une table externe.

Cette option est utile lors de la migration d'une base de données sur site vers une instance Autonomous Database si les données de vos fichiers source sont cryptées.
Remarque

Cette option est uniquement prise en charge pour les fichiers Object Storage de moins de 4 Go.

Cette option s'applique aux procédures suivantes :

  • DBMS_CLOUD.COPY_DATA

  • DBMS_CLOUD.CREATE_EXTERNAL_TABLE

  • DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE

  • DBMS_CLOUD.CREATE_HYBRID_PART_TABLE

    Pour DBMS_CLOUD.CREATE_HYBRID_PART_TABLE, cette option n'est applicable qu'aux fichiers Object Storage.

  • DBMS_CLOUD.COPY_COLLECTION

Sujets

Déchiffrer et charger des données à l'aide d'algorithmes DBMS_CRYPTO

Présente les étapes de décryptage des fichiers cryptés à partir d'Object Storage et de chargement des données dans une table sur Autonomous Database (l'étape de décryptage utilise des algorithmes DBMS_CRYPTO).

Vous devez au préalable disposer de fichiers cryptés et les télécharger vers Object Storage. Cet exemple utilise un fichier CSV. Il est supposé que le fichier est crypté à l'aide de l'algorithme DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5 et téléchargé vers le stockage d'objet cloud.

Pour plus d'informations sur la fonction ENCRYPT, reportez-vous à Fonction ENCRYPT.

Pour plus d'informations sur la génération d'une clé de cryptage, reportez-vous à DBMS_CRYPTO Operational Notes.

Pour déchiffrer et charger des données dans une table existante sur Autonomous Database à partir d'Object Storage, procédez comme suit :

  1. Connectez-vous à votre instance Autonomous Database.

    Pour plus d'informations, reportez-vous à Connexion à Autonomous Database.

  2. Stockez vos informations d'identification de stockage d'objet cloud à l'aide de la procédure DBMS_CLOUD.CREATE_CREDENTIAL,

    Par exemple :

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

    Les valeurs fournies pour username et password dépendent du service Cloud Object Storage que vous utilisez .

    Pour plus d'informations, reportez-vous à Procédure CREATE_CREDENTIAL.

    La création d'informations d'identification pour accéder à la banque d'objets Oracle Cloud Infrastructure n'est pas requise si vous activez les informations d'identification de principal de ressource. Pour plus d'informations, reportez-vous à Utilisation du principal de ressource pour accéder à des ressources Oracle Cloud Infrastructure.

  3. Créez des informations d'identification pour stocker la clé à l'aide de DBMS_CLOUD.CREATE_CREDENTIAL. Par exemple :
    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL (
        credential_name => 'ENC_CRED_NAME',
        username        => 'Any_username',
        password        => 'password'
      );
    END;
    /

    Vous pouvez également créer des informations d'identification pour stocker la clé dans un coffre. Par exemple :

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

    Le paramètre username indiqué dans les informations d'identification qui stockent la clé peut être n'importe quelle chaîne.

    Cette opération crée les informations d'identification ENC_CRED_NAME, qui sont des informations d'identification de clé secrète de coffre, dans lesquelles la clé secrète (clé de décryptage/cryptage) est stockée en tant que clé secrète dans Oracle Cloud Infrastructure Vault.

    Pour plus d'informations, reportez-vous à Procédure CREATE_CREDENTIAL.

  4. Exécutez DBMS_CLOUD.COPY_DATA et indiquez l'algorithme de cryptage DBMS_CRYPTO en tant que méthode de décryptage.
    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;
    /

    Le fichier ENCRYPTED.CSV est ainsi déchiffré dans Object Storage. Les données sont ensuite chargées dans la table CSV_COPY_DATA. La valeur de l'option encryption du paramètre format indique un algorithme de cryptage DBMS_CRYPTO à utiliser pour décrypter les données.

    Pour plus d'informations sur les algorithmes de chiffrement, reportez-vous à DBMS_CRYPTO Algorithms.

    Dans cet exemple, namespace-string est l'espace de noms d'objet Oracle Cloud Infrastructure et bucketname est le nom du bucket. Pour plus d'informations, reportez-vous à Présentation des espaces de noms Object Storage.

    Pour obtenir des informations détaillées sur les paramètres, reportez-vous à la procédure COPY_DATA.

    Pour plus d'informations sur les paramètres format disponibles, vous pouvez les utiliser avec DBMS_CLOUD.COPY_DATA, reportez-vous à DBMS_CLOUD Package Format Options.

Déchiffrer et charger des données avec une fonction définie par l'utilisateur

Affiche les étapes permettant de décrypter des fichiers dans Object Storage et de charger les données dans des tables à l'aide d'une fonction de décryptage définie par l'utilisateur.

Pour effectuer ces étapes, vous devez au préalable disposer de fichiers cryptés et les télécharger vers Object Storage. Cet exemple utilise un fichier CSV. Il est supposé que le fichier est crypté à l'aide de l'algorithme DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5 et téléchargé vers le stockage d'objet cloud.

Pour plus d'informations sur la fonction ENCRYPT, reportez-vous à Fonction ENCRYPT.

Pour plus d'informations sur la génération d'une clé de cryptage, reportez-vous à DBMS_CRYPTO Operational Notes.

Pour déchiffrer et charger des données dans une table existante sur Autonomous Database à partir d'Object Storage, procédez comme suit :

  1. Connectez-vous à votre instance Autonomous Database.

    Pour plus d'informations, reportez-vous à Connexion à Autonomous Database.

  2. Stockez vos informations d'identification de stockage d'objet cloud à l'aide de la procédure DBMS_CLOUD.CREATE_CREDENTIAL,

    Par exemple :

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

    Les valeurs fournies pour username et password dépendent du service Cloud Object Storage que vous utilisez .

    Pour plus d'informations, reportez-vous à Procédure CREATE_CREDENTIAL.

    La création d'informations d'identification pour accéder à la banque d'objets Oracle Cloud Infrastructure n'est pas requise si vous activez les informations d'identification de principal de ressource. Pour plus d'informations, reportez-vous à Utilisation du principal de ressource pour accéder à des ressources Oracle Cloud Infrastructure.

  3. Créez une fonction de rappel de décryptage de fonction définie par l'utilisateur.

    Par exemple :

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

    La fonction de décryptage DECRYPTION_FUNC est ainsi créée. Cette fonction déchiffre les données à l'aide d'un cryptage de flux ou de bloc avec une clé fournie par l'utilisateur. La clé fournie par l'utilisateur dans l'exemple est stockée dans Oracle Cloud Infrastructure Vault et est extraite dynamiquement en effectuant un appel REST vers le service Oracle Cloud Infrastructure Vault.

  4. Exécutez DBMS_CLOUD.COPY_DATA, indiquez l'option format encryption et indiquez la fonction définie par l'utilisateur que vous avez créée pour décrypter les données.
    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;
    /

    Le fichier ENCRYPTED.CSV est ainsi déchiffré dans Object Storage. Les données sont ensuite chargées dans la table CSV_COPY_DATA. La valeur de l'option encryption du paramètre format indique un nom de fonction défini par l'utilisateur à utiliser pour décrypter les données.

    Remarque

    Vous devez disposer du privilège EXECUTE sur la fonction définie par l'utilisateur.

    Dans cet exemple, namespace-string est l'espace de noms d'objet Oracle Cloud Infrastructure et bucketname est le nom du bucket. Pour plus d'informations, reportez-vous à Présentation des espaces de noms Object Storage.

    Pour obtenir des informations détaillées sur les paramètres, reportez-vous à la procédure COPY_DATA.

    Pour plus d'informations sur les paramètres format disponibles, vous pouvez les utiliser avec DBMS_CLOUD.COPY_DATA, reportez-vous à DBMS_CLOUD Package Format Options.