代码之家  ›  专栏  ›  技术社区  ›  Mr. Shiny and New 安宇

加密CLOB的最佳方法是什么?

  •  3
  • Mr. Shiny and New 安宇  · 技术社区  · 16 年前

    我正在使用Oracle9和JDBC,并希望在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_obfusion_toolkit.desencrypt(),但我们只处理varchars。以下工作是否有效?

    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;
    

    我对暂时的堵塞感到困惑,我需要关闭它吗?或者我完全偏离了轨道?

    编辑: 模糊的目的是防止对数据的简单访问。我的另一个目的是用我们已经模糊varchar列的方法来模糊clob。Oracle示例代码不处理CLOB,这是我的特定问题所在;加密varchars(小于2000个字符)是很简单的。

    3 回复  |  直到 16 年前
        1
  •  0
  •   tardate    16 年前

    我注意到你在Oracle9上,但是仅仅为了在Oracle10g+上的记录,DBMS_模糊工具箱被弃用,取而代之的是DBMS_加密。

    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
  •  2
  •   borjab    16 年前

    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('>  ');
    
        3
  •  1
  •   Alexander    16 年前

    稍微偏离主题:首先加密/模糊有什么意义?有权访问您的数据库的攻击者将能够获得明文——找到上述存储过程将使攻击者能够执行解密。