Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle डाटाबेस सुरक्षा - एन्क्रिप्शन और डिक्रिप्शन

डेटा एन्क्रिप्शन बहुत महत्वपूर्ण है क्योंकि यह इसकी गोपनीयता सुनिश्चित करने के लिए वर्तमान और संग्रहीत डेटा की सुरक्षा करने का एक तरीका है। यह अनधिकृत पहुंच और उपयोग को रोकता है। इस लेख में, मैं संक्षेप में डेटा एन्क्रिप्शन और डिक्रिप्शन के कुछ महत्वपूर्ण पहलुओं को प्रस्तुत करूंगा।

एन्क्रिप्शन सिस्टम

एन्क्रिप्शन सिस्टम में, दो मुख्य घटक होते हैं:एन्क्रिप्शन एल्गोरिथम, जो मान को बदलने के लिए उपयोग की जाने वाली विधि है, और एन्क्रिप्शन कुंजी , जिसकी सुरक्षा एन्क्रिप्टेड डेटा की भेद्यता पर निर्भर करती है।

Oracle दो प्रकार के एन्क्रिप्शन एल्गोरिदम का समर्थन करता है:सममित एल्गोरिदम (डेटा को एन्क्रिप्ट और डिक्रिप्ट करने के लिए एक ही कुंजी का उपयोग करें) संग्रहीत डेटा और असममित एल्गोरिदम को एन्क्रिप्ट करने के लिए (2 कुंजी उत्पन्न होती हैं:डिक्रिप्शन के लिए उपयोग की जाने वाली एक निजी कुंजी और एक सार्वजनिक कुंजी जिसका उपयोग संदेश भेजने वाले द्वारा संदेश को एन्क्रिप्ट करने के लिए किया जाएगा) डेटाबेस लॉगिन और डेटाबेस और क्लाइंट के बीच संचार के लिए उपयोग किया जाता है।

Oracle में उपलब्ध सममित एन्क्रिप्शन एल्गोरिदम इस प्रकार हैं:डेटा एन्क्रिप्शन मानक (देस ) जो 56 बिट्स, ट्रिपल डेटा एन्क्रिप्शन स्टैंडर्ड की एक कुंजी का उपयोग करके, एन्क्रिप्टेड टेक्स्ट के 64 बिट्स में टेक्स्ट के 64 बिट्स के ब्लॉक को एन्क्रिप्ट करता है। (3-डीईएस ), DES का अधिक उन्नत संस्करण, और उन्नत एन्क्रिप्शन मानक (एईएस ), जो 128,129 या 256 बिट्स की कुंजी का उपयोग करके, 128 बिट्स के ब्लॉक को एन्क्रिप्टेड टेक्स्ट के 128 बिट्स में एन्क्रिप्ट करता है।

कोई यह देख सकता है कि ऊपर वर्णित एन्क्रिप्शन एल्गोरिदम निश्चित आयाम के ब्लॉक का उपयोग करते हैं, और इसलिए, एन्क्रिप्ट किए जाने वाले पाठ को एक निश्चित आयाम के ब्लॉक में विभाजित किया जाएगा, जो उपयोग किए गए एल्गोरिदम द्वारा आवश्यक है और फिर, प्रत्येक प्राप्त पर एल्गोरिदम लागू किया जाएगा ब्लॉक करें।

हालांकि, क्या होगा यदि डेटा आयाम ब्लॉक के आवश्यक आयाम का गुणज नहीं है? पैडिंग तकनीक पाठ के अंतिम खंड को तब तक भरने के लिए उपयोग किया जाना चाहिए जब तक कि यह किसी ब्लॉक के आयाम तक न पहुंच जाए। कोई भी शून्य के साथ पैड चुन सकता है या PKCS#5 नामक पैडिंग योजना का उपयोग कर सकता है। योजना पिछले पाठ खंड के लिए अंतर की गणना करती है

d =dim_block - dim_data MOD dim_block

और प्रत्येक लापता बाइट को हेक्सा मान 0x0d . से भरता है ,

जहां dim_block एल्गोरिथम द्वारा आवश्यक ब्लॉक के लिए बाइट्स में आयाम है

और प्रत्येक लापता बाइट को हेक्सा मान 0x0d . से भरता है ,

जहां dim_block एल्गोरिथम द्वारा आवश्यक ब्लॉक के लिए बाइट्स में आयाम है

हालाँकि, क्या होगा यदि सादे पाठ में एन्क्रिप्ट किए जाने वाले कई ब्लॉक हों? श्रृंखला तकनीक का उपयोग किया जाता है, जो यह स्थापित करता है कि किसी ब्लॉक का एन्क्रिप्शन पिछले ब्लॉक के एन्क्रिप्शन पर निर्भर है या नहीं।

निम्नलिखित श्रृंखला के प्रकार हैं Oracle में उपलब्ध:

  • इलेक्ट्रॉनिक कोड बुक (CHAIN_ECB):प्रत्येक ब्लॉक को बाकी ब्लॉकों से स्वतंत्र रूप से एन्क्रिप्ट किया गया है। नुकसान यह है कि टेक्स्ट फ़्रैगमेंट में दोहराए जाने वाले पैटर्न की पहचान की जा सकती है।
  • सिफर ब्लॉक चेनिंग (CHAIN_CBC):प्रत्येक ब्लॉक के लिए, एन्क्रिप्शन से पहले, एक वेक्टर के साथ एक XOR ऑपरेटर लागू किया जाता है। अनुक्रम से पहले ब्लॉक के लिए, एक आरंभीकरण वेक्टर का उपयोग किया जाता है, जबकि शेष अनुक्रम से एक ब्लॉक के लिए, पिछले ब्लॉक के एन्क्रिप्शन परिणाम का उपयोग बिट्स के वेक्टर के रूप में किया जाता है
  • सिफर फीडबैक (CHAIN_CFB):यह सीबीसी के समान है, इस तथ्य को छोड़कर कि XOR ऑपरेटर को ब्लॉक एन्क्रिप्शन के बाद लागू किया जाता है।
  • आउटपुट फ़ीडबैक (CHAIN_OFB):यह CFB के समान है, इस तथ्य को छोड़कर कि पिछले ब्लॉक का परिणाम XOR ऑपरेटर के लागू होने से पहले एन्क्रिप्ट किया गया है

डेटा को एन्क्रिप्ट और डिक्रिप्ट करने के लिए, हम ORACLE में उपलब्ध DBMS_CRYPTO पैकेज का उपयोग कर सकते हैं। इस पैकेज का उपयोग करने के लिए, SYSDBA को कमांड का उपयोग करके उपयोगकर्ताओं को निष्पादन अधिकार प्रदान करना चाहिए:

GRANT EXECUTE  ON dbms_crypto TO username;

एन्क्रिप्शन के लिए, dbms_crypto.encrypt का उपयोग किया जाता है, जिसके निम्नलिखित पैरामीटर हैं:

dbms_crypto.encrypt(
clear_text IN RAW,
operating_mode IN PLS_INTEGER,
key IN RAW,
initialization_vector IN RAW DEFAULT NULL)
RETURN RAW;

डिक्रिप्शन के लिए, dbms_crypto.decrypt का उपयोग किया जाता है, जिसके निम्नलिखित पैरामीटर हैं:

dbms_crypto.decrypt(
clear_text IN RAW,
operating_mode IN PLS_INTEGER,
key IN RAW,
initialization_vector IN RAW DEFAULT NULL)
RETURN RAW;

एक ऑपरेटिंग मोड निम्न से बनता है:

एल्गोरिदम कोड + पैडिंग कोड + चेनिंग कोड

डेटा को एन्क्रिप्ट और डिक्रिप्ट करने के लिए यहां कुछ उदाहरण दिए गए हैं:

create or replace PROCEDURE encryption(text IN VARCHAR2, encrypted text OUT VARCHAR2) AS  
raw_set RAW(100);  
raw_password RAW(100);  
encryption_result RAW(100);  
encryption_password VARCHAR2(100) := '[email protected]%5,:QxV';  
operation_mode NUMBER; 
    BEGIN    
        raw_set:=utl_i18n.string_to_raw(text,'AL32UTF8');    
        raw_password := utl_i18n.string_to_raw(encryption_password,'AL32UTF8');        
        operation_mode:=DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.PAD_ZERO + DBMS_CRYPTO.CHAIN_ECB;        
        encryption_result:=DBMS_CRYPTO.ENCRYPT(raw_set,operation_mode,raw_password);           
        dbms_output.put_line(encryption_result);    
        encryptedtext := RAWTOHEX (encryption_result);  
END; 

variable result_encryption varchar2(200) 
exec encryption('Text to be encrypted', :result_encryption); 
print result_encryption

create or replace PROCEDURE decryption (encrypted_text IN VARCHAR2, decrypted_text OUT VARCHAR2) AS   
raw_set RAW(100);   
raw_password RAW(100);   
decryption_result RAW(100);   
decryption_password VARCHAR2(100) := '[email protected]%5,:QxV';   
operation_mode NUMBER; 
    BEGIN   
        raw_set:=HEXTORAW(encrypted_text);   
        raw_password :=utl_i18n.string_to_raw(decryption_password,'AL32UTF8');   
        operation_mode:=DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.PAD_ZERO + DBMS_CRYPTO.CHAIN_ECB;      
        decryption_result:=DBMS_CRYPTO.DECRYPT(raw_set,operation_mode,raw_password);   
        dbms_output.put_line(decryption_result);   
        decrypted_text := utl_i18n.raw_to_char (decryption_result,'AL32UTF8'); 
    END;  
variable result_decryption varchar2(200) 
exec decryption(:result_encryption,:result_decryption) 
print result_decryption 

डेटा एन्क्रिप्शन चुनौतियां

डेटा के लिए एन्क्रिप्शन कुंजियों का प्रबंधन

डेटाबेस उपयोगकर्ताओं के लिए कुशल एन्क्रिप्शन कुंजियों को मैन्युअल रूप से उत्पन्न करना मुश्किल है, जिनकी एन्क्रिप्शन एल्गोरिथम के लिए आवश्यक लंबाई है। एक स्ट्रिंग सेट के रूप में एन्क्रिप्शन कुंजी की मैन्युअल आपूर्ति के संबंध में (तब रॉ में परिवर्तित), सेट की लंबाई की गणना निम्न सूत्र का उपयोग करके की जाती है:

L_set =Length_key_in_bits / 8 (अक्षर)

उदाहरण के लिए, ENCRYPT_AES128 के लिए, कुंजी में 128 बिट हैं और सेट की लंबाई L_set =128/8 =16 वर्ण होगी।

यदि कुंजी '1234567890123456' की आपूर्ति की जाती है, तो इसे स्वीकार किया जाएगा, जबकि कुंजी '1234' अपवाद को 'कुंजी लंबाई बहुत छोटा' फेंक देगी।

शेष एल्गोरिदम के लिए, निम्न तालिका प्रभावी कुंजी लंबाई देती है:

मुख्य पीढ़ी और संचरण

डेटा सुरक्षित रूप से एन्क्रिप्ट किया जाता है जब तक कि एन्क्रिप्ट करने के लिए उपयोग की जाने वाली कुंजी सुरक्षित है। इसलिए, एन्क्रिप्शन कुंजी सुरक्षित रूप से उत्पन्न होनी चाहिए। DBMS_CRYPTO फ़ंक्शन पैकेज का RANDOMBYTES एक सुरक्षित यादृच्छिक संख्या पीढ़ी प्रदान करता है और यादृच्छिक संख्या जनरेटर एल्गोरिथ्म को लागू करता है। डेवलपर्स को DBMS_RANDOM पैकेज का उपयोग नहीं करना चाहिए क्योंकि यह छद्म यादृच्छिक संख्या उत्पन्न करता है, जिसके परिणामस्वरूप छद्म सुरक्षा हो सकती है।

RANDOMBYTES फ़ंक्शन का उपयोग इस प्रकार किया जाता है:

कुंजी रॉ (nr_bytes);

key:=DBMS_CRYPTO.randombytes (nr_bytes);

जहां nr_bytes एन्क्रिप्शन कुंजी के बाइट्स की संख्या का प्रतिनिधित्व करता है

जब किसी एप्लिकेशन से डेटाबेस में कुंजी पास की जाती है, तो इसे एन्क्रिप्ट किया जाना चाहिए ताकि इसे प्रेषित होने पर चोरी न हो। Oracle उन्नत सुरक्षा नेटवर्क एन्क्रिप्शन प्रदान करता है, जो उनके नेटवर्क ट्रांज़िट में डेटा और क्रिप्टोग्राफ़िक कुंजियों की सुरक्षा करता है।

एक बार चाबियां तैयार हो जाने के बाद, उन्हें सुरक्षित रखा जाना चाहिए, क्योंकि उनके प्रकटीकरण से एन्क्रिप्टेड डेटा की सुरक्षा से समझौता हो सकता है। चाबी रखने के तीन विकल्प हैं:

  • डेटाबेस स्तर पर:डेटाबेस में संग्रहीत (एक विशेष तालिका में) या बाहरी डेटाबेस फ़ाइल में
  • रिकॉर्ड स्तर पर:डेटाबेस में संग्रहीत (एक विशेष तालिका में)
  • पिछले दो प्रकारों के बीच एक संयोजन:डेटाबेस स्तर पर एक मास्टर कुंजी होती है और प्रत्येक रिकॉर्ड के लिए, एक कुंजी होती है। एन्क्रिप्शन और डिक्रिप्शन दोनों के लिए एक हाइब्रिड कुंजी का उपयोग किया जाता है:हाइब्रिड_की =मास्टर_की XOR रिकॉर्ड_की (XOR फ़ंक्शन के लिए, एक PL/SQL फ़ंक्शन है - UTL_RAW.bit_xor)।

सबसे कुशल कुंजी क्या है? यह हाइब्रिड कुंजी है। यदि संपूर्ण डेटाबेस चोरी हो जाता है, तो फ़ाइल सिस्टम में मास्टर कुंजी संग्रहीत होने पर डेटा को डिक्रिप्ट नहीं किया जा सकता है। यदि मास्टर कुंजी या कुंजी रिकॉर्ड चोरी हो जाता है, तो शेष रिकॉर्ड अभी भी सुरक्षित रहेगा।

पारदर्शी डेटा एन्क्रिप्शन (TDE)

Oracle द्वारा प्रदान की जाने वाली एक अन्य सुरक्षा सुविधा है पारदर्शी डेटा एन्क्रिप्शन (TDE) , Oracle 10g से उपलब्ध एक सुविधा। TDE डेटाबेस के टेबल स्तर पर एक एन्क्रिप्टेड कॉलम घोषित करने की अनुमति देता है। एन्क्रिप्टेड कॉलम में डेटा डालने पर, Oracle स्वचालित रूप से डेटा को एन्क्रिप्ट करता है और डेटाबेस में उनके एन्क्रिप्शन को स्टोर करता है।

कोई भी चयन क्वेरी स्वचालित रूप से डेटा को डिक्रिप्ट कर देगी। यह याद रखना महत्वपूर्ण है कि पारदर्शी डेटा एन्क्रिप्शन उपयोगकर्ताओं के बीच अंतर नहीं करता है, और डिक्रिप्टेड डेटा देता है चाहे कोई भी डेटाबेस से पूछताछ कर रहा हो। टीडीई द्वारा किसी भी कॉलम को एन्क्रिप्ट नहीं किया जा सकता है:बाहरी कुंजी (विदेशी कुंजी) से कॉलम को इस पद्धति का उपयोग करके एन्क्रिप्ट नहीं किया जा सकता है।

उदाहरण के लिए:संबंधपरक योजना ACCOUNT (id_account#, card_series, धारक, राशि) के साथ ACCOUNT नामक तालिका पर विचार करें, जहां id_account को प्राथमिक कुंजी माना जाता है, तथ्य को '#' चिह्न द्वारा दर्शाया जाता है। आइए मान लें कि हम card_series घोषित करना चाहते हैं और बैलेंस कॉलम एन्क्रिप्ट किया जाना है। यह निम्नलिखित के साथ किया जा सकता है:

ALTER TABLE accont MODIFY (card_series ENCRYPT USING 'AES128');
ALTER TABLE accont MODIFY (balance ENCRYPT USING 'AES128');

इस पद्धति के काम करने के लिए, एक वॉलेट बनाया और कॉन्फ़िगर किया जाना चाहिए।

पारदर्शी डेटा एन्क्रिप्शन क्यों करता है डेटाबेस चोरी होने की स्थिति में डेटा के डिक्रिप्शन को रोकें? खैर, तालिका T के सभी एन्क्रिप्टेड कॉलम एक ही निजी कुंजी Key_T का उपयोग करते हैं। यदि हमारे पास अधिक टेबल हैं, ,…, जिसमें एन्क्रिप्टेड कॉलम हैं, तो n निजी कुंजियाँ हैं, Key_,…,Key_। प्रत्येक निजी कुंजी Key_, j=1,n को मास्टर कुंजी, Key_Master के साथ एन्क्रिप्ट किया गया है, और इस एन्क्रिप्शन का परिणाम डेटा डिक्शनरी में संग्रहीत किया जाता है। मास्टर कुंजी बाहरी रूप से एक वॉलेट में संग्रहीत होती है।

अब, आइए इस स्वचालित एन्क्रिप्शन के चरणों को देखें। वे हैं:

  • बाहरी वॉलेट से मास्टर Key_Master प्राप्त करना
  • मास्टर कुंजी का उपयोग करके निजी कुंजी, Key_ का डिक्रिप्शन
  • निजी कुंजी, कुंजी का उपयोग करके सम्मिलित किए जाने वाले डेटा का एन्क्रिप्शन_
  • एन्क्रिप्टेड डेटा को टेबल कॉलम में स्टोर करना

स्वचालित डिक्रिप्शन के चरण हैं:

  • बाहरी वॉलेट से मास्टर कुंजी, Key_Master प्राप्त करना
  • मास्टर कुंजी का उपयोग करके निजी कुंजी, Key_ का डिक्रिप्शन
  • निजी कुंजी, Key_ का उपयोग करके डेटा का डिक्रिप्शन _
  • परिणाम लौटाना

एन्क्रिप्ट करते समय डेटा अखंडता के बारे में क्या? यहाँ हम हैशिंग तकनीक का उपयोग करते हैं।

हैशिंग

डेटा एन्क्रिप्शन डेटा की गोपनीयता सुनिश्चित करता है लेकिन उनकी अखंडता की गारंटी नहीं देता है। इस समस्या को रोकने के लिए, इस तथ्य के अलावा कि केवल मूल डेटा को एन्क्रिप्ट किया जाना चाहिए, हम हैशिंग नामक तकनीक का उपयोग कर सकते हैं। . दो महत्वपूर्ण लाभ हैं:यह मूल मूल्यों को समझने की अनुमति नहीं देता है और यह नियतात्मक है (जिसका अर्थ है कि एक ही डेटा पर बार-बार लागू होने पर, यह एक ही परिणाम उत्पन्न करता है)। Oracle निम्नलिखित हैशिंग एल्गोरिदम की अनुमति देता है:MD5 और SHA-1।

उपयोग:

DBMS_CRYPTO.Hash (
original_set IN RAW,
operation_mode IN PLS_INTEGER) 
RETURN RAW;
where operation_mode is either                        
DBMS_CRYPTO.HASH_MD5 or DBMS_CRYPTO.HASH_SH1
है

उदाहरण:

set serveroutput on
DECLARE
credit_card_no VARCHAR2(19) := '1234-5678-1234-5678';
credit_card_no_raw RAW(128) := utl_raw.cast_to_raw(credit_card_no);
encrypted_raw RAW(2048);
BEGIN
  encrypted_raw:=dbms_crypto.hash(credit_card_no_raw, dbms_crypto.hash_md5);
  dbms_output.put_line('MD5: ' || encrypted_raw);
END;

अनुक्रमित डेटा एन्क्रिप्ट करना

डेवलपर्स के लिए अनुक्रमित डेटा को एन्क्रिप्ट करने की अनुशंसा नहीं की जाती है। यदि किसी कॉलम की अनुक्रमणिका में एन्क्रिप्टेड मान हैं, तो अनुक्रमणिका का उपयोग सरल जाँच के लिए किया जा सकता है और अन्य उद्देश्यों के लिए अनुपयोगी है।

उदाहरण के लिए, मान लीजिए कि कोई कंपनी डेटाबेस तालिका में संग्रहीत कर्मचारी संख्या के लिए व्यक्तिगत पहचान संख्या का उपयोग करती है। जाहिर है, उन नंबरों को संवेदनशील और गोपनीय डेटा माना जाता है और कंपनी उस कॉलम को एन्क्रिप्ट करना चाहती है जहां इसे संग्रहीत किया जाता है। चूंकि इस कॉलम में अद्वितीय मान हैं, इसलिए बेहतर प्रदर्शन के लिए इस पर एक इंडेक्स किया जा सकता है। इसका मतलब है कि सूचकांक में एन्क्रिप्टेड डेटा होगा और मूल रूप से अनुपयोगी होगा।

निष्कर्ष

निष्कर्ष निकालने के लिए, संवेदनशील डेटा को एन्क्रिप्ट और डिक्रिप्ट करके सुरक्षित करना बहुत महत्वपूर्ण है। इस पहलू से अवगत होना चाहिए और तदनुसार डेटाबेस सुरक्षा को लागू करना चाहिए।

संदर्भ:

  1. डेटा एन्क्रिप्शन का उपयोग करके एप्लिकेशन विकसित करना
  2. फ्यूएरस्टीन स्टीवन (2009) Oracle PL/SQL प्रोग्रामिंग (5वां संस्करण)। ओ'रेली प्रकाशन। आईएसबीएन 978-0-596-51446-4। अध्याय 23 "एप्लिकेशन सुरक्षा और पीएल/एसक्यूएल"
  3. ऑपरेशन के सिफर मोड को ब्लॉक करें

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं कैसे पता लगा सकता हूं कि कौन सी तालिकाएँ Oracle SQL डेवलपर में दी गई तालिका का संदर्भ देती हैं?

  2. डिफ़ॉल्ट रूप से ORACLE 11g केस असंवेदनशील

  3. ओरेकल डीबी:मैं मामले की अनदेखी करते हुए क्वेरी कैसे लिख सकता हूं?

  4. Oracle EBS ऑडिटिंग कैसे सेटअप करें

  5. sysdate के साथ to_date फ़ंक्शन के साथ समस्या