2

我是加密新手,我想弄清楚 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

所以现在我有一个加密文件。

我使用 blobs/clobs 将我的加密文件和我的 pub 密钥加载到一个 Oracle 表中。我正在尝试使用 dbms_crypto.decrypt 函数来解密文件:

select dbms_crypto.decrypt(
          encrypted_file,
          ?,
          utl_raw.cast_to_raw('public_key'),
          null)
from crypto_test_lobs

在这一点上,我不确定要为第二个参数传递什么值,即“要使用的流或块密码类型和修饰符”。我尝试了几种不同的组合,导致各种可能不值得发布的异常。

所以我的问题是:

  1. 这可能吗?
  2. 我如何弄清楚第二个论点?

谢谢

4

3 回答 3

2

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;
于 2014-11-01T13:22:42.640 回答
0

Short answer to your first question: no, the large answer, the Oracle function seems to use only symmetric cyphers, while the key you created (RSA) is for use with asymmetric cyphers, this won't work. My recommendation is to take a look at the DES and AES algorithms and how they work so you better understand why.

于 2012-11-26T20:25:33.453 回答
0

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。

于 2012-11-26T20:18:23.890 回答