Was ist der beste Weg, um eine clob zu verschlüsseln?
-
01-07-2019 - |
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.
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