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

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

如果源文件中的数据已加密,此选项在从内部部署数据库迁移到 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 算法解密和加载数据

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

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

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

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

要从对象存储将数据解密并加载到 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 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 Algorithms

    在此示例中,namespace-string 是 Oracle Cloud Infrastructure 对象存储名称空间,bucketname 是存储桶名称。有关更多信息,请参见 Understanding Object Storage Namespaces

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

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

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

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

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

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

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

要从对象存储将数据解密并加载到 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 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 是存储桶名称。有关更多信息,请参见 Understanding Object Storage Namespaces

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

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