Frage

Ich bin mit Oracle 9 und JDBC und möchte eine clob encyrpt, wie es in die DB eingeführt wird. Im Idealfall würde Ich mag nur den Klartext in der Lage sein zu setzen und lassen Sie es von einer gespeicherten Prozedur verschlüsselt:

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

Der Klartext wird nicht erwartet, 4000 Zeichen überschreiten, aber Verschlüsselungs- macht Text länger. Unser aktueller Ansatz zur Verschlüsselung verwendet dbms_obfuscation_toolkit.DESEncrypt (), aber wir nur Prozess Varchars. Funktioniert die folgende Arbeit?

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;

Ich bin verwirrt über die vorübergehende clob; brauche ich es zu schließen? Oder bin ich total Off-Track?

Edit: Der Zweck der Verschleierung ist trivial Zugriff auf die Daten zu verhindern. Mein anderer Zweck ist CLOBs auf die gleiche Weise zu verschleiern, dass wir bereits die Varchar Spalten Verschleiern. Das Orakel Beispielcode nicht mit CLOBs befassen, die ist, wo mein spezifisches Problem liegt; Verschlüsseln Varchars (kleiner als 2000 Zeichen) ist einfach.

War es hilfreich?

Lösung

Ich stelle fest, Sie sind auf Oracle 9, sondern nur für das Protokoll in Oracle 10g + der dbms_obfuscation_toolkit wurde zugunsten dbms_crypto veraltet.

dbms_crypto tut CLOB- Unterstützung umfassen :

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);

Andere Tipps

Es gibt ein Beispiel in Oracle Dokumentation:

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

Sie müssen nicht um es schließen

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('>  ');

Ein wenig Off-Topic: Was ist der Sinn der Verschlüsselung / Verschleierung in erster Linie? Ein Angreifer Zugriff auf Ihre Datenbank mit in der Lage, den Klartext zu erhalten -. Die oben gespeicherte Prozedur zu finden, wird der Angreifer ermöglichen, die Entschlüsselung durchführen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top