ما هي أفضل طريقة لتشفير clob؟
-
01-07-2019 - |
سؤال
أنا أستخدم Oracle 9 و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_obfuscation_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.لا يتعامل نموذج التعليمات البرمجية الخاص بـ Oracle مع الكتل حيث تكمن مشكلتي المحددة؛يعد تشفير varchars (أصغر من 2000 حرف) أمرًا سهلاً.
المحلول
ألاحظ أنك تستخدم Oracle 9، ولكن فقط للسجل في Oracle 10g+، تم إهمال dbms_obfuscation_toolkit لصالح dbms_crypto.
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);
نصائح أخرى
يوجد مثال في وثائق أوراكل:
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('> ');
خارج الموضوع قليلا:ما الهدف من التشفير/التشويش في المقام الأول؟سيتمكن المهاجم الذي لديه حق الوصول إلى قاعدة البيانات الخاصة بك من الحصول على النص العادي - فالعثور على الإجراء المخزن أعلاه سيمكن المهاجم من تنفيذ فك التشفير.