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 的初始化向量长度

使用 DBMS_CRYPTO 加密数据

Oracle PL/SQL语句基础学习笔记(上)

异常后停止 PL/SQL 代码(PL/SQL、ORACLE)

oracle pl/sql 基础

Oracle——PL/SQL