Oracle PL/SQL dbms_crypto 包可以解密使用 Linux gpg 命令加密的文件吗?
Posted
技术标签:
【中文标题】Oracle PL/SQL dbms_crypto 包可以解密使用 Linux gpg 命令加密的文件吗?【英文标题】:Can the Oracle PL/SQL dbms_crypto package decrypt a file encrypted with the Linux gpg command? 【发布时间】:2012-11-26 20:03:04 【问题描述】:我是加密新手,我想弄清楚 Linux gpg 命令和 Oracle 的 dbms_crypto 包是否可以一起工作。 Oracle 版本是 11R2。我将收到由不同系统加密的文件,如果可能,我想通过 PL/SQL 解密它们。我正在以 POC 的身份运行下面的线程,看看这是否可能。
在 Linux 提示符下,我使用以下命令创建了一个密钥:
gpg --gen-key
使用此命令创建了一个公钥(使用实际的电子邮件地址):
gpg --armor --export xxx@yyy.com > mypublickey
并像这样加密我的文件:
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
此时我不确定要为第二个参数传递什么值,即“要使用的流或块密码类型和修饰符”。我尝试了几种不同的组合,这些组合导致了可能不值得发布的各种异常。
所以我的问题是:
-
这可能吗?
如何找出第二个参数?
谢谢
【问题讨论】:
这个参数你试过什么?根据docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_crypto.htm,它是一个由 DBMS_CRYPTO.ENCRYPT_AES256、DBMS_CRYPTO.CHAIN_CBC、DBMS_CRYPTO.PAD_PKCS5 等常量组合而成的整数 尝试了表 39-5、7 和 8 的几种组合。从这里docs.oracle.com/cd/E11882_01/appdev.112/e25788/…。真的只是在黑暗中刺伤。不知道 Rafael 提到的对称/不对称密码。 【参考方案1】:gpg 使用OpenPGP 协议进行加密,您需要一个支持 OpenPGP 的 PL/SQL 包。
一个商业PL/SQL包OraPGP支持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;
【讨论】:
【参考方案2】:How do I figure out that 2nd argument?
第二个参数是一个整数,它定义了要使用的算法。另见http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_crypto.htm。在 PL/SQL 中,您可以使用 DBMS_CRYPTO 包中的常量来设置这些值,例如将 AES-256 与 CBC 和 PKCS5-padding 一起使用,使用类似
encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES256
+ DBMS_CRYPTO.CHAIN_CBC
+ DBMS_CRYPTO.PAD_PKCS5;
在 PL/SQL 之外,您需要知道常量定义的实际数字。有关相应列表,请参阅http://www.remote-dba.net/t_advanced_dbms_crypto.htm。要定义与上述相同的算法,您将使用 8 + 256 + 4096。
【讨论】:
【参考方案3】:对您的第一个问题的简短回答:不,大答案,Oracle 函数似乎只使用对称密码,而您创建的密钥 (RSA) 用于非对称密码,这不起作用。我的建议是查看 DES 和 AES 算法以及它们的工作原理,以便您更好地理解原因。
【讨论】:
以上是关于Oracle PL/SQL dbms_crypto 包可以解密使用 Linux gpg 命令加密的文件吗?的主要内容,如果未能解决你的问题,请参考以下文章
Oracle DBMS_CRYPTO.ENCRYPT AES256 的初始化向量长度