2008-09-18 94 views
3

我使用的是Oracle 9和JDBC,想因爲它是插入到數據庫到encyrpt一個CLOB。理想情況下,我想能夠只是插入明文,並經一個存儲過程加密:什麼是加密clob的最佳方式?

String SQL = "INSERT INTO table (ID, VALUE) values (?, encrypt(?))"; 
PreparedStatement ps = connection.prepareStatement(SQL); 
ps.setInt(id); 
ps.setString(plaintext); 
ps.executeUpdate(); 

預計不會明文超過4000個字符,但加密使得文本更長。我們目前的加密方法使用dbms_obfuscation_toolkit.DESEncrypt(),但我們將只處理VARCHAR處理。以下的工作?

FUNCTION encrypt(p_clob IN CLOB) RETURN CLOB 
IS 
    encrypted_string  CLOB; 
    v_string    CLOB; 
BEGIN 
    dbms_lob.createtemporary(encrypted_string, TRUE); 
    v_string := p_clob; 
    dbms_obfuscation_toolkit.DESEncrypt(
    input_string => v_string, 
    key_string => key_string, 
    encrypted_string => encrypted_string); 
    RETURN UTL_RAW.CAST_TO_RAW(encrypted_string); 
END; 

我對臨時clob感到困惑;我需要關閉它嗎?或者我完全偏離軌道?

編輯:混淆的 的目的是爲了防止數據瑣碎的訪問。我的另一個目的是以與我們已經混淆varchar列相同的方式混淆clobs。 oracle示例代碼不涉及clobs,這是我的具體問題所在;加密varchars(小於2000個字符)很簡單。

回答

0

我注意到你在Oracle 9,但只是在Oracle 10g中記錄的+在DBMS_OBFUSCATION_TOOLKIT有利於DBMS_CRYPTO的被棄用。

dbms_crypto不包括CLOB支持:

DBMS_CRYPTO.ENCRYPT(
    dst IN OUT NOCOPY BLOB, 
    src IN   CLOB   CHARACTER SET ANY_CS, 
    typ IN   PLS_INTEGER, 
    key IN   RAW, 
     iv IN   RAW   DEFAULT NULL); 

DBMS_CRYPT.DECRYPT(
    dst IN OUT NOCOPY CLOB   CHARACTER SET ANY_CS, 
    src IN   BLOB, 
    typ IN   PLS_INTEGER, 
    key IN   RAW, 
    iv IN   RAW   DEFAULT NULL); 
2

有一個在Oracle文檔的例子:

http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96612/d_obtoo2.htm

您不必將其關閉

DECLARE 
    input_string  VARCHAR2(16) := 'tigertigertigert'; 
    raw_input   RAW(128) := UTL_RAW.CAST_TO_RAW(input_string); 
    key_string   VARCHAR2(8) := 'scottsco'; 
    raw_key    RAW(128) := UTL_RAW.CAST_TO_RAW(key_string); 
    encrypted_raw    RAW(2048); 
    encrypted_string   VARCHAR2(2048); 
    decrypted_raw    RAW(2048); 
    decrypted_string   VARCHAR2(2048); 
    error_in_input_buffer_length EXCEPTION; 
    PRAGMA EXCEPTION_INIT(error_in_input_buffer_length, -28232); 
    INPUT_BUFFER_LENGTH_ERR_MSG VARCHAR2(100) := 
    '*** DES INPUT BUFFER NOT A MULTIPLE OF 8 BYTES - IGNORING 
EXCEPTION ***'; 
    double_encrypt_not_permitted EXCEPTION; 
    PRAGMA EXCEPTION_INIT(double_encrypt_not_permitted, -28233); 
    DOUBLE_ENCRYPTION_ERR_MSG VARCHAR2(100) := 
    '*** CANNOT DOUBLE ENCRYPT DATA - IGNORING EXCEPTION ***'; 

    -- 1. Begin testing raw data encryption and decryption 
     BEGIN 
    dbms_output.put_line('> ========= BEGIN TEST RAW DATA ========='); 
    dbms_output.put_line('> Raw input      : ' || 
      UTL_RAW.CAST_TO_VARCHAR2(raw_input)); 
    BEGIN 
     dbms_obfuscation_toolkit.DESEncrypt(input => raw_input, 
       key => raw_key, encrypted_data => encrypted_raw); 
     dbms_output.put_line('> encrypted hex value    : ' || 
      rawtohex(encrypted_raw)); 
    dbms_obfuscation_toolkit.DESDecrypt(input => encrypted_raw, 
      key => raw_key, decrypted_data => decrypted_raw); 
    dbms_output.put_line('> Decrypted raw output    : ' || 
       UTL_RAW.CAST_TO_VARCHAR2(decrypted_raw)); 
    dbms_output.put_line('> ');  
    if UTL_RAW.CAST_TO_VARCHAR2(raw_input) = 
       UTL_RAW.CAST_TO_VARCHAR2(decrypted_raw) THEN 
    dbms_output.put_line('> Raw DES Encyption and Decryption successful'); 
    END if; 
    EXCEPTION 
     WHEN error_in_input_buffer_length THEN 
      dbms_output.put_line('> ' || INPUT_BUFFER_LENGTH_ERR_MSG); 
    END; 
    dbms_output.put_line('> '); 
+0

這並沒有真正回答這個問題;對於一個它不使用CLOBS,對於兩個它不具有與原始函數相同的語義: 函數encrypt(clob中的明文)返回clob - 返回密碼文本 – 2008-09-24 14:26:54

1

稍微偏離主題:什麼是在加密/混淆點第一名?有權訪問數據庫的攻擊者將能夠獲取明文 - 查找上述存儲過程將使攻擊者能夠執行解密。

+0

該密鑰不應該存儲在您的數據庫中,但從應用程序傳入。 – 2008-09-19 10:45:32

相關問題