ما هي أفضل طريقة لتشفير clob؟

أنا أستخدم Oracle 9 و JDBC ونرغب في تشفير clob حيث يتم إدخاله في DB. من الناحية المثالية ، أود أن أكون قادرًا على مجرد إدراج النص العادي وجعله مشفرًا بواسطة إجراء مخزن:

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. رمز عينة أوراكل لا يتعامل مع الأقطاب حيث تكمن مشكلتي المحددة ؛ تشفير varchars (أصغر من 2000 حرف) مباشرة.

0

3 إجابة

هناك مثال في وثائق أوراكل:

http://download.oracle.com/docs/ مؤتمر نزع السلاح/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('>  ');
0
وأضاف
هذا لا يجيب على السؤال. لواحد لا يستخدم CLOBS وللاثنين أنه لا يحتوي على نفس الدلالات مثل الوظيفة الأصلية: وظيفة تشفير (نص عادي في clob) إرجاع clob - إرجاع النص cypher
وأضاف المؤلف Mr. Shiny and New 安宇, مصدر

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

0
وأضاف
الهدف هنا هو المزيد حول منع المستخدمين من الوصول المصرح به من الكشف عن البيانات الحساسة عن طريق الخطأ.
وأضاف المؤلف Mr. Shiny and New 安宇, مصدر
يمكن أن يكون لديك نسخة احتياطية مع البيانات غير المحملة مشكلة أمان. على أي حال ، أوافق على أن المستند سيسافر بدون تشفير على الشبكة ولكن لهذا الغرض من الأفضل تشفير الاتصال الكامل بـ https.
وأضاف المؤلف borjab, مصدر
يجب ألا يتم تخزين المفتاح في قاعدة البيانات الخاصة بك ، ولكن تم تمريره من التطبيق.
وأضاف المؤلف Matthew Watson, مصدر
أوافق على التعليق ، لكن الشفرة الأصلية لا تنقل أي مفاتيح إلى وظيفة التشفير.
وأضاف المؤلف Alexander, مصدر
يقوم مسؤول النظام sysadmins بتشفير النسخ الاحتياطية على أي حال - لن تحتاج إلى أن تكون بيانات قاعدة البيانات مشفرة للحصول على نسخ احتياطية من قاعدة البيانات مطفرة. يظهر هنا أن هدف التشفير هنا هو منع المستخدمين من الوصول غير المصرح به إلى قاعدة البيانات من قراءة CLOBs.
وأضاف المؤلف Alexander, مصدر

ألاحظ أنك تستخدم Oracle 9 ، ولكن فقط للتسجيل في Oracle 10g + تم إيقاف dbms_obfuscation_toolkit لصالح 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
وأضاف