从对象存储导入时解密数据

您可以解密和加载对象存储中存储的加密文件中的数据。您还可以解密在外部表中使用的对象存储上的加密数据。

如果源文件中的数据已加密,则此选项在从内部部署数据库迁移到自治 AI 数据库时非常有用。

注:仅对象存储文件支持小于 4 GB 的此选项。

此选项适用于以下过程:

使用 DBMS_CRYPTO 算法解密和加载数据

显示从对象存储解密加密文件并将数据加载到自治 AI 数据库上的表的步骤(解密步骤使用 DBMS_CRYPTO 算法)。

作为先决条件,您必须加密文件并将文件上载到对象存储。此示例使用 CSV 文件,并假定该文件使用 DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5 算法进行加密并上载到云对象存储。

有关 ENCRYPT 函数的更多信息,请参见 ENCRYPT Function

有关生成加密密钥的更多信息,请参见 DBMS_CRYPTO Operational Notes

要从对象存储解密数据并将其加载到自治 AI 数据库上的现有表中,请执行以下操作:

  1. 连接到自治 AI 数据库实例。

  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 Procedure

  3. 使用 DBMS_CLOUD.CREATE_CREDENTIAL 创建用于存储密钥的身份证明。例如:

     BEGIN
       DBMS_CLOUD.CREATE_CREDENTIAL (
         credential_name => 'ENC_CRED_NAME',
         username        => '*Any_username*',
         password        => 'password'
       );
     END;
     /
    

    或者,您可以创建身份证明以将密钥存储在 Vault 中。例如:

     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 身份证明,该身份证明是 Vault 密钥身份证明,其中密钥(解密/加密密钥)作为密钥存储在 Oracle Cloud Infrastructure Vault 中。

    有关更多信息,请参见 CREATE_CREDENTIAL Procedure

  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 是存储桶名称。有关详细信息,请参阅了解对象存储名称空间

    有关参数的详细信息,请参见 COPY_DATA Procedure

    有关可用 format 参数的详细信息,可以与 DBMS_CLOUD.COPY_DATA 一起使用,请参见 DBMS_CLOUD Package Format Options

使用用户定义的函数解密和加载数据

显示使用用户定义的解密函数解密对象存储中的文件并将数据加载到表的步骤。

作为执行这些步骤的先决条件,您必须加密文件并将文件上载到对象存储。此示例使用 CSV 文件,并假定该文件使用 DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5 算法进行加密并上载到云对象存储。

有关 ENCRYPT 函数的更多信息,请参见 ENCRYPT Function

有关生成加密密钥的更多信息,请参见 DBMS_CRYPTO Operational Notes

要从对象存储解密数据并将其加载到自治 AI 数据库上的现有表中,请执行以下操作:

  1. 连接到自治 AI 数据库实例。

  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 Procedure

  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 是存储桶名称。有关详细信息,请参阅了解对象存储名称空间

    有关参数的详细信息,请参见 COPY_DATA Procedure

    有关可用 format 参数的详细信息,可以与 DBMS_CLOUD.COPY_DATA 一起使用,请参见 DBMS_CLOUD Package Format Options