Was ist der beste Weg, um einen Clob zu verschlüsseln?

Ich benutze Oracle 9 und JDBC und möchte einen Clob verschlüsseln, wenn er in die DB eingefügt wird. Idealerweise möchte ich einfach den Klartext einfügen und ihn durch eine gespeicherte Prozedur verschlüsseln lassen:

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

Es wird nicht erwartet, dass der Klartext 4000 Zeichen überschreitet, aber durch die Verschlüsselung wird Text länger. Unser aktueller Ansatz zur Verschlüsselung verwendet dbms_obfuscation_toolkit.DESEncrypt (), aber wir verarbeiten nur Varchars. Wird 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 den temporären Clob; Muss ich es schließen? Oder bin ich total daneben?

Bearbeiten: Der Zweck der Verschleierung besteht darin, einen trivialen Zugriff auf die Daten zu verhindern. Mein anderer Zweck ist es, Klischees so zu verschleiern, wie wir die Varchar-Spalten bereits verschleiern. Der Orakel-Beispielcode behandelt keine Clobs, wo mein spezifisches Problem liegt; Vcrchars (kleiner als 2000 Zeichen) zu verschlüsseln ist einfach.

0

3 Antworten

Es gibt ein Beispiel in der Oracle-Dokumentation:

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

Sie müssen es nicht 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('>  ');
0
hinzugefügt
Dies beantwortet die Frage nicht wirklich; zum einen verwendet es CLOBS nicht und für zwei hat es nicht dieselbe Semantik wie die ursprüngliche Funktion: function encrypt (Klartext in clob) zurückgebende clob - gibt Cypher-Text zurück
hinzugefügt der Autor Mr. Shiny and New 安宇, Quelle

Etwas off-topic: Was ist der Sinn der Verschlüsselung/Verschleierung überhaupt? Ein Angreifer, der Zugriff auf Ihre Datenbank hat, kann den Klartext erhalten. Wenn die oben beschriebene gespeicherte Prozedur gefunden wird, kann der Angreifer die Entschlüsselung durchführen.

0
hinzugefügt
Das Ziel besteht darin, zu verhindern, dass Benutzer mit autorisiertem Zugriff versehentlich vertrauliche Daten preisgeben.
hinzugefügt der Autor Mr. Shiny and New 安宇, Quelle
Ein Backup mit den unverschlüsselten Daten kann ein Sicherheitsproblem darstellen. Wie auch immer, ich stimme zu, dass das Dokument unverschlüsselt über das Netzwerk läuft, aber zu diesem Zweck ist es besser, die gesamte Verbindung mit https zu verschlüsseln.
hinzugefügt der Autor borjab, Quelle
Der Schlüssel sollte nicht in Ihrer Datenbank gespeichert, sondern von der Anwendung übergeben werden.
hinzugefügt der Autor Matthew Watson, Quelle
Ich stimme dem Kommentar zu, aber der ursprüngliche Code gibt keine Schlüssel an die Verschlüsselungsfunktion weiter.
hinzugefügt der Autor Alexander, Quelle
Ordentliche Systemadministratoren verschlüsseln Backups trotzdem - Sie müssen die Datenbankdaten nicht verschlüsseln, damit die Backups der Datenbank verschlüsselt werden. Es scheint hier, dass das Ziel der Verschlüsselung darin besteht, zu verhindern, dass Benutzer unberechtigten Zugriff auf die Datenbank erhalten, indem sie die CLOBs lesen.
hinzugefügt der Autor Alexander, Quelle

Ich bemerke, dass Sie auf Oracle 9 sind, aber nur für die Aufzeichnung in Oracle 10g + wurde das dbms_obfuscation_toolkit zugunsten von dbms_crypto veraltet.

dbms_crypto does include CLOB support:

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);
0
hinzugefügt