从对象存储导入时解密数据
您可以解密和加载对象存储中存储的加密文件中的数据。您还可以解密在外部表中使用的对象存储上的加密数据。
如果源文件中的数据已加密,则此选项在从内部部署数据库迁移到自治 AI 数据库时非常有用。
注:仅对象存储文件支持小于 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 算法解密和加载数据
显示从对象存储解密加密文件并将数据加载到自治 AI 数据库上的表的步骤(解密步骤使用 DBMS_CRYPTO 算法)。
作为先决条件,您必须加密文件并将文件上载到对象存储。此示例使用 CSV 文件,并假定该文件使用 DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5 算法进行加密并上载到云对象存储。
有关 ENCRYPT 函数的更多信息,请参见 ENCRYPT Function 。
有关生成加密密钥的更多信息,请参见 DBMS_CRYPTO Operational Notes 。
要从对象存储解密数据并将其加载到自治 AI 数据库上的现有表中,请执行以下操作:
-
连接到自治 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_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 。
-
运行
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 数据库上的现有表中,请执行以下操作:
-
连接到自治 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 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 调用来动态检索。 -
运行
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 。