سؤال

أنا أستخدم 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('>  ');

خارج الموضوع قليلا:ما الهدف من التشفير/التشويش في المقام الأول؟سيتمكن المهاجم الذي لديه حق الوصول إلى قاعدة البيانات الخاصة بك من الحصول على النص العادي - فالعثور على الإجراء المخزن أعلاه سيمكن المهاجم من تنفيذ فك التشفير.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top