导出到对象存储时加密数据
在导出到对象存储时,您可以加密表数据。
在从自治 AI 数据库导出到对象存储时,将 format 参数和 encryption 选项与 DBMS_CLOUD.EXPORT_DATA 结合使用以加密数据。
将加密数据导出到对象存储时,请注意以下事项:
-
仅当将数据作为 CSV、JSON 或 XML 从自治 AI 数据库导出到对象存储时,才支持
encryption选项。 -
当导出同时包括加密和压缩时,操作顺序为:首先对数据进行压缩,然后对数据进行加密,然后将其上载到对象存储。
-
有两种支持的加密方法:
-
使用用户定义的函数。
-
使用
DBMS_CRYPTO指定的加密算法。有关加密和解密的加密功能和过程的信息,请参见 DBMS_CRYPTO 。
-
使用 DBMS_CRYPTO 加密算法加密数据
显示导出到云对象存储时使用 DBMS_CRYPTO 加密算法加密数据的步骤。
在导出到云对象存储时,执行以下步骤对数据进行加密(此示例将表数据导出到 CSV 文件):
-
连接到自治 AI 数据库实例。
-
使用
DBMS_CLOUD.CREATE_CREDENTIAL存储您的云对象存储身份证明。例如:
BEGIN DBMS_CLOUD.CREATE_CREDENTIAL( credential_name => 'OBJ_STORE_CRED', username => 'user1@example.com', password => 'password' ); END; /为
username和password提供的值取决于您使用的云对象存储服务。有关更多信息,请参见 CREATE_CREDENTIAL Procedure 。
-
创建用于存储加密密钥(用于加密数据的加密密钥)的身份证明。
使用
DBMS_CRYPTO加密算法加密数据时,会将加密密钥存储在身份证明中。密钥是在您使用DBMS_CLOUD.CREATE_CREDENTIAL创建的身份证明的password字段中指定的。例如:
BEGIN DBMS_CLOUD.CREATE_CREDENTIAL ( credential_name => 'ENC_CRED_NAME', username => 'Any_username', password => 'password' ); END; / -
运行
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 算法。
在此示例中,
namespace-string是 Oracle Cloud Infrastructure 对象存储名称空间,bucketname是存储桶名称。有关详细信息,请参阅了解对象存储名称空间。有关更多信息,请参见 EXPORT_DATA Procedure 和 DBMS_CLOUD Package Format Options for EXPORT_DATA 。
使用 DBMS_CLOUD.EXPORT_DATA 加密文件后,使用 DBMS_CRYPTO 加密算法加密文件时,可以使用以下选项来使用或导入导出的文件:
-
您可以将
DBMS_CLOUD.COPY_DATA或DBMS_CLOUD.COPY_COLLECTION与相同的加密算法选项和密钥一起使用来解密文件。有关详细信息,请参阅使用 DBMS_CRYPTO 算法解密和加载数据。
-
您可以通过提供相同的加密算法选项和用于解密文件的密钥来查询外部表中的数据,并执行以下任何过程:
-
DBMS_CLOUD.CREATE_EXTERNAL_TABLE -
DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE -
DBMS_CLOUD.CREATE_HYBRID_PART_TABLE对于
DBMS_CLOUD.CREATE_HYBRID_PART_TABLE,此选项仅适用于对象存储文件。
有关详细信息,请参阅使用 DBMS_CRYPTO 算法解密和加载数据。
-
-
在不是自治 AI 数据库的系统上,您可以使用具有相同算法选项和密钥的
DBMS_CRYPTO软件包来解密文件。请注意,密钥作为
VARCHAR2存储在自治 AI 数据库的身份证明中,但DBMS_CRYPTO使用RAW类型作为密钥参数。有关加密算法的详情,请参阅 DBMS_CRYPTO 算法。
使用用户定义的加密功能加密数据
显示在导出到云对象存储时使用用户定义的加密功能加密数据的步骤。
在导出到云对象存储时,执行以下步骤对数据进行加密(此示例将表数据导出到 CSV 文件):
-
连接到自治 AI 数据库实例。
-
使用
DBMS_CLOUD.CREATE_CREDENTIAL存储您的云对象存储身份证明。例如:
BEGIN DBMS_CLOUD.CREATE_CREDENTIAL( credential_name => 'OBJ_STORE_CRED', username => 'user1@example.com', password => 'password' ); END; /您为
username和password提供的值取决于您使用的云对象存储服务。有关更多信息,请参见 CREATE_CREDENTIAL Procedure 。
-
创建用户定义的回调函数以加密数据。
例如:
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 。 -
使用
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是存储桶名称。有关详细信息,请参阅了解对象存储名称空间。有关更多信息,请参见 EXPORT_DATA Procedure 和 DBMS_CLOUD Package Format Options for EXPORT_DATA 。