एक क्लोब एन्क्रिप्ट करने का सबसे अच्छा तरीका क्या है?

मैं ओरेकल 9 और जेडीबीसी का उपयोग कर रहा हूं और डीबी में डालने के रूप में एक क्लोब को एन्क्रिप्ट करना चाहता हूं। आदर्श रूप से मैं सिर्फ सादा पाठ डालने में सक्षम होना चाहता हूं और इसे संग्रहीत प्रक्रिया द्वारा एन्क्रिप्ट किया गया है:

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() का उपयोग करता है लेकिन हम केवल वर्चर्स को संसाधित करते हैं। क्या निम्नलिखित काम करेंगे?

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;

मैं अस्थायी clob के बारे में उलझन में हूँ; क्या मुझे इसे बंद करने की ज़रूरत है? या मैं पूरी तरह से ऑफ-ट्रैक हूँ?

संपादित करें: Obfuscation का उद्देश्य डेटा तक छोटी पहुंच को रोकने के लिए है। मेरा दूसरा उद्देश्य क्लब्स को उसी तरह से खराब करना है जिस तरह से हम पहले से ही वर्चर्स कॉलम को खराब कर रहे हैं। ऑरैकल नमूना कोड क्लब्स से निपटता नहीं है, जहां मेरी विशिष्ट समस्या है; वर्चर्स एन्क्रिप्टेड (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
जोड़ा
यह वास्तव में सवाल का जवाब नहीं देता है; एक के लिए यह सीएलबीबीएस का उपयोग नहीं करता है और दो के लिए यह मूल कार्य के समान वही अर्थशास्त्र नहीं है: फ़ंक्शन एन्क्रिप्ट (क्लोब में सादे टेक्स्ट) लौटने पर - रिफर साइफर टेक्स्ट
जोड़ा लेखक Mr. Shiny and New 安宇, स्रोत

थोड़ा सा विषय: पहली जगह एन्क्रिप्शन/obfuscation का बिंदु क्या है? आपके डेटाबेस तक पहुंचने वाले एक हमलावर को सादे टेक्स्ट प्राप्त करने में सक्षम हो जाएगा - उपर्युक्त संग्रहीत प्रक्रिया को खोजने से हमलावर को डिक्रिप्शन करने में सक्षम बनाया जाएगा।

0
जोड़ा
लक्ष्य यहां उपयोगकर्ताओं को गलती से संवेदनशील डेटा प्रकट करने से अधिकृत पहुंच के साथ रोकने के बारे में अधिक है।
जोड़ा लेखक Mr. Shiny and New 安宇, स्रोत
अनएक्षित डेटा के साथ बैकअप रखना एक सुरक्षा समस्या हो सकती है। वैसे भी, मैं मानता हूं कि दस्तावेज़ नेटवर्क पर अनइंक्रिप्टेड यात्रा करेगा लेकिन उस उद्देश्य के लिए https के साथ पूरे कनेक्शन को एन्क्रिप्ट करना बेहतर होगा।
जोड़ा लेखक borjab, स्रोत
कुंजी को आपके डेटाबेस में संग्रहीत नहीं किया जाना चाहिए, लेकिन एप्लिकेशन से पास किया जाना चाहिए।
जोड़ा लेखक Matthew Watson, स्रोत
मैं टिप्पणी से सहमत हूं, लेकिन मूल कोड एन्क्रिप्शन फ़ंक्शन में किसी भी कुंजी को पास नहीं कर रहा है।
जोड़ा लेखक Alexander, स्रोत
डीसेंट sysadmins वैसे भी बैकअप एन्क्रिप्ट करें - डेटाबेस डेटाबेस के बैकअप रखने के लिए आपको डेटाबेस डेटा एन्क्रिप्ट करने की आवश्यकता नहीं है। ऐसा लगता है कि यहां एन्क्रिप्शन का लक्ष्य उपयोगकर्ताओं को सीएलओबी पढ़ने से डेटाबेस में अनधिकृत पहुंच रखने से रोकने के लिए है।
जोड़ा लेखक Alexander, स्रोत

मुझे लगता है कि आप ओरेकल 9 पर हैं, लेकिन सिर्फ ओरेकल 10 जी + में रिकॉर्ड के लिए 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
जोड़ा