什么是加密clob的最佳方式?

问题描述:

我使用的是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个字符)很简单。

我注意到你在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); 

有一个在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

稍微偏离主题:什么是在加密/混淆点第一名?有权访问数据库的攻击者将能够获取明文 - 查找上述存储过程将使攻击者能够执行解密。

+0

该密钥不应该存储在您的数据库中,但从应用程序传入。 – 2008-09-19 10:45:32