Oracle PL/SQL dbms_加密包能否解密使用Linux gpg命令加密的文件?
我是加密新手,正在尝试弄清楚LinuxGPG命令和Oracle的dbms_加密包是否可以一起工作。Oracle版本是11R2。我将接收由另一个系统加密的文件,如果可能的话,我想通过PL/SQL对它们进行解密。我正在以POC的身份运行下面的线程,看看这是否可行 在Linux提示符下,我使用以下命令创建了一个密钥:Oracle PL/SQL dbms_加密包能否解密使用Linux gpg命令加密的文件?,oracle,plsql,gnupg,dbms-crypto,Oracle,Plsql,Gnupg,Dbms Crypto,我是加密新手,正在尝试弄清楚LinuxGPG命令和Oracle的dbms_加密包是否可以一起工作。Oracle版本是11R2。我将接收由另一个系统加密的文件,如果可能的话,我想通过PL/SQL对它们进行解密。我正在以POC的身份运行下面的线程,看看这是否可行 在Linux提示符下,我使用以下命令创建了一个密钥: gpg --gen-key 使用此命令创建公钥(使用实际电子邮件地址): 并对我的文件进行如下加密: gpg -r xxx@yyy.com --output input.txt.enc
gpg --gen-key
使用此命令创建公钥(使用实际电子邮件地址):
并对我的文件进行如下加密:
gpg -r xxx@yyy.com --output input.txt.encrypted --encrypt input.txt
其中包括以下信息:
gpg: encrypted with 2048-bit RSA key
现在我有一个加密文件
我使用blob/clob将加密文件和pub密钥加载到Oracle表中。我正在尝试使用dbms_crypto.decrypt函数对文件进行解密:
select dbms_crypto.decrypt(
encrypted_file,
?,
utl_raw.cast_to_raw('public_key'),
null)
from crypto_test_lobs
此时,我不确定要为第二个参数传递什么值,第二个参数是“要使用的流或分组密码类型和修饰符”。我尝试了几种不同的组合,它们导致了各种可能不值得发布的异常
因此,我的问题是:
谢谢
我如何理解第二个参数?
第二个参数是定义要使用的算法的整数。另见。在PL/SQL中,您可以使用DBMS_CRYPTO包中的常量来设置这些值,例如,要将AES-256与CBC和PKCS5填充一起使用,请使用
encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES256
+ DBMS_CRYPTO.CHAIN_CBC
+ DBMS_CRYPTO.PAD_PKCS5;
在PL/SQL之外,您需要知道常量定义的实际数字。有关相应的列表,请参阅。要定义与上述相同的算法,您将使用8+256+4096。第一个问题的简短回答:不,大的答案是,Oracle函数似乎只使用对称密码,而您创建的密钥(RSA)用于非对称密码,这将不起作用。我的建议是查看DES和AES算法及其工作原理,以便您更好地了解原因。gpg使用该协议进行加密,您需要支持OpenPGP的PL/SQL包 商业PL/SQL包支持OpenPGP,下面是使用它进行解密的示例:
DECLARE
MESSAGE VARCHAR2(2000);
PRIVATE_KEY VARCHAR2(200);
KEY_PASSWORD VARCHAR2(200);
v_Return VARCHAR2(200);
BEGIN
MESSAGE := NULL;
PRIVATE_KEY := 'c:\PGPKeys\private_key.asc';
KEY_PASSWORD := 'key password';
SELECT encrypted_data_field INTO MESSAGE
FROM my_data_table
WHERE my_id = 1000;
v_Return := ORA_PGP.DECRYPT(
MESSAGE => MESSAGE,
PRIVATE_KEY => PRIVATE_KEY,
KEY_PASSWORD => KEY_PASSWORD
);
DBMS_OUTPUT.PUT_LINE('Decrypted data = ' || v_Return);
END;
您对此参数尝试了什么?根据,它是一个带有常数组合的整数,如DBMS_CRYPTO.ENCRYPT_AES256、DBMS_CRYPTO.CHAIN_CBC、DBMS_CRYPTO.PAD_PKCS5尝试了表39-5、7和8的几种组合。从这里开始。真的只是在黑暗中刺伤。不知道Rafael提到的对称/不对称密码。
DECLARE
MESSAGE VARCHAR2(2000);
PRIVATE_KEY VARCHAR2(200);
KEY_PASSWORD VARCHAR2(200);
v_Return VARCHAR2(200);
BEGIN
MESSAGE := NULL;
PRIVATE_KEY := 'c:\PGPKeys\private_key.asc';
KEY_PASSWORD := 'key password';
SELECT encrypted_data_field INTO MESSAGE
FROM my_data_table
WHERE my_id = 1000;
v_Return := ORA_PGP.DECRYPT(
MESSAGE => MESSAGE,
PRIVATE_KEY => PRIVATE_KEY,
KEY_PASSWORD => KEY_PASSWORD
);
DBMS_OUTPUT.PUT_LINE('Decrypted data = ' || v_Return);
END;