Care este cel mai bun mod de a cripta un clob?

Eu folosesc Oracle 9 și JDBC și aș dori să encyrpt un clob așa cum este inserat în DB. În mod ideal, aș vrea să pot introduce textul plaintei și să îl cript prin procedură stocată:

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

Plaintext nu este de așteptat să depășească 4000 de caractere, dar criptarea face textul mai lung. Abordarea noastră actuală la criptare folosește dbms_obfuscation_toolkit.DESEncrypt (), dar procesăm doar varchars. Vor funcționa următoarele?

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;

Sunt confuz cu privire la clobotul temporar; trebuie să-l închid? Sau sunt total off-track?

Editați | ×: Scopul obfuscării este de a împiedica accesul trivial la date. Altul meu scop este de a obfusc clobsul în același mod în care deja încurcăm coloanele varchar. Codul eșantionului oracol nu se ocupă de clobs, unde se află problema mea specifică; criptarea varcharelor (mai mici de 2000 de caractere) este simplă.

0

3 răspunsuri

Există un exemplu în documentația Oracle:

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

Nu trebuie să închideți

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
adăugat
Acest lucru nu răspunde cu adevărat la întrebare; pentru unul nu folosește CLOBS, iar pentru două nu are aceeași semantică ca și funcția inițială: funcția criptează (plaintext în clob) returnând clob - returnează textul ciprului
adăugat autor Mr. Shiny and New 安宇, sursa

Ușor de sub-subiect: Care este punctul de criptare/obfuscation în primul rând? Un atacator care are acces la baza dvs. de date va fi capabil să obțină textul plaintext - găsirea procedurii memorate mai sus va permite atacatorului să efectueze decriptarea.

0
adăugat
Scopul aici este mai mult de a împiedica utilizatorii cu acces autorizat să dezvăluie accidental date sensibile.
adăugat autor Mr. Shiny and New 安宇, sursa
A avea o copie de rezervă cu datele necriptate poate fi o problemă de securitate. Oricum, sunt de acord că documentul va călători necriptat prin rețea, dar în acest scop este mai bine să criptați întreaga conexiune cu https.
adăugat autor borjab, sursa
Cheia nu ar trebui să fie stocată în baza de date, ci trecuta din aplicație.
adăugat autor Matthew Watson, sursa
Sunt de acord cu comentariul, dar codul original nu transmite oricare chei la funcția de criptare.
adăugat autor Alexander, sursa
De sysadmins decriptate criptează backup-urile oricum - nu este nevoie să aveți datele bazei de date criptate pentru a avea copii de siguranță ale bazei de date encypted. Se pare că obiectivul de criptare aici este de a împiedica utilizatorii care au acces neautorizat la baza de date să citească CLOB-urile.
adăugat autor Alexander, sursa

Notez că sunteți pe Oracle 9, dar doar pentru înregistrarea în Oracle 10g +, dbms_obfuscation_toolkit a fost depreciat în favoarea dbms_crypto.

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
adăugat