2012-11-26 82 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; 
相關問題