从对象存储导入时解密数据
必须启用 JavaScript 才能正确显示此内容
从对象存储导入时解密数据
您可以对存储在对象存储中的加密文件解密和加载数据。还可以对在外部表中使用的对象存储上的加密数据进行解密。
如果源文件中的数据已加密,此选项在从内部部署数据库迁移到
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 上的现有表中,请执行以下操作:
连接到 Autonomous Database 实例。
使用 DBMS_CLOUD.CREATE_CREDENTIAL
存储您的云对象存储身份证明。
例如:
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL
(
credential_name => 'OBJ_STORE_CRED',
username => 'user1@example.com',
password => 'password '
);
END;
/
为 username
和 password
提供的值取决于您使用的云对象存储服务。
使用 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 Algorithms 。
使用用户定义的函数解密和加载数据
显示使用用户定义的解密函数对对象存储中的文件进行解密并将数据加载到表中的步骤。
作为这些步骤的先决条件,您必须已加密文件并将文件上载到对象存储。此示例使用 CSV 文件,并假定该文件使用 DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5
算法加密并上载到云对象存储。
有关 ENCRYPT
函数的更多信息,请参见 ENCRYPT Function 。
有关生成加密密钥的更多信息,请参见DBMS_CRYPTO Operational Notes 。
要从对象存储将数据解密并加载到 Autonomous Database 上的现有表中,请执行以下操作:
连接到 Autonomous Database 实例。
使用 DBMS_CLOUD.CREATE_CREDENTIAL
存储您的云对象存储身份证明。
例如:
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL
(
credential_name => 'OBJ_STORE_CRED',
username => 'user1@example.com',
password => 'password '
);
END;
/
为 username
和 password
提供的值取决于您使用的云对象存储服务。
创建用户定义的函数解密回调函数。
例如:
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
特权。