從物件儲存匯入時解密資料

您可以從儲存在 Object Storage 中的加密檔案解密和載入資料。您也可以解密在外部表格中使用的 Object Storage 上加密的資料。

如果來源檔案中的資料經過加密,則此選項在從內部部署資料庫移轉至 Autonomous Database 時非常有用。

附註:

只有小於 4 GB 的物件儲存檔案才支援此選項。

此選項適用於下列程序:

  • DBMS_CLOUD.COPY_DATA

  • DBMS_CLOUD.CREATE_EXTERNAL_TABLE

  • DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE

  • DBMS_CLOUD.CREATE_HYBRID_PART_TABLE

    對於 DBMS_CLOUD.CREATE_HYBRID_PART_TABLE,此選項僅適用於物件儲存檔案。

  • DBMS_CLOUD.COPY_COLLECTION

使用 DBMS_CRYPTO 演算法解密與載入資料

顯示解密 Object Storage 中加密檔案並將資料載入 Autonomous Database 上表格的步驟 (解密步驟使用 DBMS_CRYPTO 演算法)。

先決條件是您必須擁有加密的檔案,並將檔案上傳至物件儲存。此範例使用 CSV 檔案,並假設該檔案使用 DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5 演算法進行加密,然後上傳至您的雲端物件儲存。

如需 ENCRYPT 函數的詳細資訊,請參閱 ENCRYPT 函數

如需產生加密金鑰的詳細資訊,請參閱 DBMS_CRYPTO Operational Notes

若要解密資料並將其從 Object Storage 載入 Autonomous Database 上的現有表格,請執行下列動作:

  1. 連線到您的 Autonomous Database 執行處理。
  2. 使用 DBMS_CLOUD.CREATE_CREDENTIAL 儲存您的雲端物件儲存證明資料。

    舉例而言:

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

    您為 usernamepassword 提供的值取決於您使用的雲端物件儲存服務。

    如需詳細資訊,請參閱CREATE_CREDENTIAL 程序

  3. 使用 DBMS_CLOUD.CREATE_CREDENTIAL 建立證明資料以儲存金鑰。例如:
    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL (
        credential_name => 'ENC_CRED_NAME',
        username        => 'Any_username',
        password        => 'password'
      );
    END;
    /

    或者,您也可以建立證明資料,將金鑰儲存在保存庫中。舉例而言:

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

    附註:

    您在儲存金鑰的證明資料中指定的 username 參數可以是任何字串。

    這會建立 ENC_CRED_NAME 證明資料 (保存庫加密密碼證明資料),其中加密密碼 (解密 / 加密金鑰) 會儲存為 Oracle Cloud Infrastructure Vault 中的加密密碼。

    如需詳細資訊,請參閱CREATE_CREDENTIAL 程序

  4. 執行 DBMS_CLOUD.COPY_DATA 並指定 DBMS_CRYPTO 加密演算法作為解密方法。
    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/namepace-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;
    /

    這會解密物件儲存中的 ENCRYPTED.CSV 檔案。接著會將資料載入 CSV_COPY_DATA 表格中。format 參數 encryption 選項值指定用來解密資料的 DBMS_CRYPTO 加密演算法。

    如需有關加密演算法的詳細資訊,請參閱 DBMS_CRYPTO 演算法

    在此範例中,namespace-string 是 Oracle Cloud Infrastructure 物件儲存命名空間,bucketname 是儲存桶名稱。請參閱瞭解 Object Storage 命名空間瞭解詳細資訊。

    如需有關參數的詳細資訊,請參閱 COPY_DATA 程序

    如需可用 format 參數的詳細資訊,您可以與 DBMS_CLOUD.COPY_DATA 搭配使用,請參閱

使用使用者定義函數解密及載入資料

顯示解密物件儲存中的檔案並使用使用者定義的解密函數將資料載入表格的步驟。

您必須具備加密檔案並將檔案上傳至物件儲存,才能具備這些步驟的先決條件。此範例使用 CSV 檔案,並假設該檔案使用 DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5 演算法進行加密,然後上傳至您的雲端物件儲存。

如需 ENCRYPT 函數的詳細資訊,請參閱 ENCRYPT 函數

如需產生加密金鑰的詳細資訊,請參閱 DBMS_CRYPTO Operational Notes

若要解密資料並將其從 Object Storage 載入 Autonomous Database 上的現有表格,請執行下列動作:

  1. 連線到您的 Autonomous Database 執行處理。
  2. 使用 DBMS_CLOUD.CREATE_CREDENTIAL 儲存您的雲端物件儲存證明資料。

    舉例而言:

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

    您為 usernamepassword 提供的值取決於您使用的雲端物件儲存服務。

    如需詳細資訊,請參閱CREATE_CREDENTIAL 程序

  3. 建立使用者定義函數解密回呼函數。

    舉例而言:

    CREATE OR REPLACE FUNCTION decryption_func(data IN BLOB)
    RETURN BLOB
    IS
      l_decrypted_data BLOB;
    BEGIN
      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 => 'encryption key'
        );
      RETURN l_decrypted_data;
    END decryption_callback;
    /

    這會建立 DECRYPTION_FUNC 解密函數。此函數會使用使用者提供的金鑰,使用串流或區塊加密解密資料。範例中使用者提供的金鑰會儲存在 Oracle Cloud Infrastructure Vault 中,並透過對 Oracle Cloud Infrastructure Vault 服務進行 REST 呼叫來動態擷取。

  4. 執行 DBMS_CLOUD.COPY_DATA 並指定 format 選項 encryption,並指定您建立用來解密資料的使用者定義函數。
    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/namepace-string/b/bucketname/o/encrypted.csv',
        format          => json_object(
                             'type' value 'csv',
                             'encryption' value json_object('user_defined_function' value 'admin.decryption_func'))
      );
    end;
    /

    這會解密物件儲存中的 ENCRYPTED.CSV 檔案。接著會將資料載入 CSV_COPY_DATA 表格中。format 參數 encryption 選項值指定用於解密資料的使用者定義函數名稱。

    附註:

    您必須具備使用者定義函數的 EXECUTE 權限。

    在此範例中,namespace-string 是 Oracle Cloud Infrastructure 物件儲存命名空間,bucketname 是儲存桶名稱。請參閱瞭解 Object Storage 命名空間瞭解詳細資訊。

    如需有關參數的詳細資訊,請參閱 COPY_DATA 程序

    如需可用 format 參數的詳細資訊,您可以搭配 DBMS_CLOUD.COPY_DATA 使用,請參閱 DBMS_CLOUD Package Format Options