导出到对象存储时对数据进行加密

导出到对象存储时,可以对表数据进行加密。

format 参数和 encryption 选项与 DBMS_CLOUD.EXPORT_DATA 一起使用,以在从 Autonomous Database 导出到对象存储时加密数据。

将加密数据导出到对象存储时,请注意以下事项:

  • 仅当将数据从 Autonomous Database 以 CSV、JSON 或 XML 格式导出到对象存储时,才支持 encryption 选项。

  • 导出同时包括加密和压缩时,操作顺序为:首先压缩数据,然后加密数据,然后将其上载到对象存储。

  • 有两种支持的加密方法:

    • 使用用户定义的函数。

    • 使用 DBMS_CRYPTO 指定的加密算法。

      有关加密功能和加密和解密过程的信息,请参见 DBMS_CRYPTO

使用 DBMS_CRYPTO 加密算法对数据进行加密

显示在导出到云对象存储时使用 DBMS_CRYPTO 加密算法对数据进行加密的步骤。

导出到云对象存储时,执行以下步骤对数据进行加密(此示例将表数据导出到 CSV 文件):

  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_CRYPTO 加密算法对数据进行加密时,会将加密密钥存储在凭证中。该密钥在您使用 DBMS_CLOUD.CREATE_CREDENTIAL 创建的凭证的 password 字段中指定。

    例如:

    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL (
        credential_name => 'ENC_CRED_NAME',
        username        => 'Any_username',
        password        => 'password'
      );
    END;
    /
  4. 运行 DBMS_CLOUD.EXPORT_DATA

    format 参数与 encryption 选项一起使用。encryption 类型指定用于加密表数据的 DBMS_CRYPTO 加密算法,credential_name 值是用于指定密钥(加密密钥)的身份证明。

    例如:

    BEGIN
        DBMS_CLOUD.EXPORT_DATA (
            credential_name => 'OBJ_STORE_CRED',
            file_uri_list   => 'https://objectstorage.us-phoenix-1.oraclecloud.com/n/namepace-string/b/bucketname/o/encrypted.csv',
            query           => 'SELECT * FROM ADMIN.employees',
            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;
    /

    这将加密数据并将其从 EMPLOYEES 表导出到 CSV 文件。

    有关加密算法的更多信息,请参见DBMS_CRYPTO Algorithms

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

    有关更多信息,请参见EXPORT_DATA ProcedureDBMS_CLOUD Package Format Options for EXPORT_DATA

使用 DBMS_CLOUD.EXPORT_DATA 加密文件后,使用 DBMS_CRYPTO 加密算法加密文件时,可以使用以下选项来使用或导入导出的文件:

  • 您可以将 DBMS_CLOUD.COPY_DATADBMS_CLOUD.COPY_COLLECTION 与相同的加密算法选项和密钥一起使用来解密文件。

    有关更多信息,请参见 Decrypt and Load Data Using DBMS_CRYPTO Algorithms

  • 您可以使用以下任一过程,通过提供相同的加密算法选项和解密文件的密钥来查询外部表中的数据:

    • DBMS_CLOUD.CREATE_EXTERNAL_TABLE

    • DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE

    • DBMS_CLOUD.CREATE_HYBRID_PART_TABLE

      对于 DBMS_CLOUD.CREATE_HYBRID_PART_TABLE,此选项仅适用于对象存储文件。

    有关更多信息,请参见 Decrypt and Load Data Using DBMS_CRYPTO Algorithms

  • 在非 Autonomous Database 的系统上,您可以使用具有相同算法选项和密钥的 DBMS_CRYPTO 程序包解密文件。

    请注意,密钥以 VARCHAR2 形式存储在 Autonomous Database 的身份证明中,但 DBMS_CRYPTO 对密钥参数使用 RAW 类型。

    有关加密算法的更多信息,请参见DBMS_CRYPTO Algorithms

使用用户定义的加密功能对数据进行加密

显示在导出到云对象存储时使用用户定义的加密函数加密数据的步骤。

导出到云对象存储时,执行以下步骤对数据进行加密(此示例将表数据导出到 CSV 文件):

  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 encryption_func (data IN BLOB)
      RETURN BLOB
      IS
          l_encrypted_data BLOB;
           BEGIN   
         DBMS_LOB.CREATETEMPORARY (l_encrypted_data, TRUE, DBMS_LOB.CALL);
         DBMS_CRYPTO.ENCRYPT (
             dst => l_encrypted_data,
             src => data,
             typ => DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5,
             key => 'encryption key'
          );
         RETURN l_encrypted_data;
    END encryption_func;
    /

    这将创建 ENCRYPTION_FUNC 加密函数。此函数使用带有用户提供的密钥的流或块密码加密数据。

    注意:

    必须创建一个加密密钥,以用作 KEY 参数中的值。有关生成加密密钥的更多信息,请参见DBMS_CRYPTO Operational Notes
  4. 使用 format 参数运行 DBMS_CLOUD.EXPORT_DATA ,包括 encryption 选项并指定 user_defined_function

    例如:

    BEGIN
          DBMS_CLOUD.EXPORT_DATA (
            credential_name => 'OBJ_STORE_CRED',
            file_uri_list   => 'https://objectstorage.us-phoenix-1.oraclecloud.com/n/namepace-string/b/bucketname/o/encrypted.csv',
            query           => 'SELECT * FROM ADMIN.emp',
            format          => json_object( 
                                  'type' value 'csv', 
                                  'encryption' value json_object('user_defined_function' value 'admin.encryption_func'))
          );
    END;
    /

    这将加密 EMP 表上的指定查询中的数据,并将数据导出为云对象存储上的 CSV 文件。带有 encryption 值的 format 参数指定用于加密数据的用户定义的加密函数。

    注意:

    您必须对加密函数具有 EXECUTE 特权。

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

    有关更多信息,请参见EXPORT_DATA ProcedureDBMS_CLOUD Package Format Options for EXPORT_DATA