2012-11-26 47 views
2

我是加密新手,想弄清楚Linux gpg命令和Oracle的dbms_crypto软件包是否可以一起工作。 Oracle版本是11R2。如果可能的话,我将接收由不同系统加密的文件,并希望通过PL/SQL解密它们。我正在通过下面的线程作为POC来查看这是否可能。Oracle PL/SQL dbms_crypto包可以解密使用Linux gpg命令加密的文件吗?

在Linux提示我创建了这个命令的关键:

gpg --gen-key 

创建与此命令公钥(使用实际的电子邮件地址):

gpg --armor --export [email protected] > mypublickey 

和加密我的文件中像此:

gpg -r [email protected] --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. 如何找出第二个参数?

由于

+0

你尝试过这个参数是什么?根据http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_crypto.htm,它是一个整数与常量组合如DBMS_CRYPTO.ENCRYPT_AES256,DBMS_CRYPTO.CHAIN_CBC,DBMS_CRYPTO.PAD_PKCS5 –

+0

试过几个表39-5,7和8的组合。从这里http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_crypto.htm#CHDBJIEF。真的只是在黑暗中刺伤。不知道拉斐尔提到的对称/非对称密码。 – John

回答

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-填充,使用类似

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.

0

对第一个问题的简短回答:不,大回答,Oracle函数似乎只使用对称密码,而您创建的密钥RSA)用于不对称密码,这是行不通的。我的建议是看看DES和AES算法,以及它们如何工作,以便更好地理解原因。

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; 
相关问题