पासवर्ड को कूटने और उसे एन्क्रिप्ट करने के बीच अंतर


140

इस सवाल पर वर्तमान शीर्ष मतदान :

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

वास्तव में यह अंतर क्या है? मैं हमेशा इस धारणा के तहत था कि हैशिंग एन्क्रिप्शन का एक रूप था। पोस्टर किस असुरक्षित कार्यक्षमता की बात कर रहा है?


एक लिखित लेख, जिसके बारे में आपको केवल रहस्य / पासवर्ड क्यों नहीं चाहिए। इसके बजाय HMAC का उपयोग करें। benlog.com/articles/2008/06/19/dont-hash-secrets
जय कुमार

StackExchange Security ब्लॉग पर विषय का उत्कृष्ट सारांश: security.blogoverflow.com/2011/11/…
David J. Liszewski

@ जयकुमार: आपने जो लेख जोड़ा है वह बहुत ही भ्रामक है। यह मैक कुंजी के साथ पासवर्ड लवण (जो हमलावरों को दिखाई देने की उम्मीद है) का सामना करता है (जो गुप्त रहने की उम्मीद है)। डेविड जे। लिस्ज़ेव्स्की लिंक बहुत अधिक सटीक विवरण प्रदान करता है।
रफालविंड

जवाबों:


222

हाशिंग एक तरह से फ़ंक्शन (अच्छी तरह से, एक मैपिंग) है। यह अपरिवर्तनीय है, आप सुरक्षित हैश एल्गोरिथ्म लागू करते हैं और आपको मूल स्ट्रिंग वापस नहीं मिल सकती है। सबसे अधिक आप जो कर सकते हैं, उसे "टक्कर" कहा जाता है, जो कि एक अलग स्ट्रिंग ढूंढता है जो समान हैश प्रदान करता है। क्रिप्टोग्राफिक रूप से सुरक्षित हैश एल्गोरिदम को टकराव की घटना को रोकने के लिए डिज़ाइन किया गया है। आप एक सुरक्षित हैश पर एक इंद्रधनुष तालिका के उपयोग से हमला कर सकते हैं , जिसे आप स्टैच से पहले हैश में नमक लगाकर काउंटर कर सकते हैं ।

एन्क्रिप्ट करना एक उचित (दो तरीका) फ़ंक्शन है। यह प्रतिवर्ती है, यदि आपके पास कुंजी है तो आप मूल स्ट्रिंग प्राप्त करने के लिए मैंगल्ड स्ट्रिंग को डिक्रिप्ट कर सकते हैं।

यह जिस असुरक्षित कार्यक्षमता की बात कर रहा है, वह यह है कि यदि आप पासवर्ड एन्क्रिप्ट करते हैं, तो आपके एप्लिकेशन में कुंजी कहीं संग्रहीत है और एक हमलावर जो आपके डेटाबेस (और / या कोड) तक पहुंच प्राप्त करता है, कुंजी और एन्क्रिप्ट किए गए पाठ दोनों को प्राप्त करके मूल पासवर्ड प्राप्त कर सकता है। , जबकि हैश के साथ यह असंभव है।

लोग आमतौर पर कहते हैं कि अगर कोई पटाखा आपके डेटाबेस या आपके कोड का मालिक है, तो उसे पासवर्ड की आवश्यकता नहीं है, इस प्रकार अंतर मूट है। यह भोली है, क्योंकि आप अभी भी अपने उपयोगकर्ताओं के पासवर्ड की रक्षा करने का कर्तव्य रखते हैं, मुख्य रूप से क्योंकि उनमें से अधिकांश एक ही पासवर्ड का उपयोग बार-बार करते हैं, अपने पासवर्ड को लीक करके अधिक जोखिम के लिए उजागर करते हैं।


1
स्पष्ट होने के लिए, हैश के साथ वांछित सुरक्षा प्राप्त करें, यह विशिष्ट संपत्ति के साथ एक क्रिप्टोग्राफिक रूप से सुरक्षित हैश एल्गोरिथ्म होना चाहिए जो कि न केवल हैश गैर-प्रतिवर्ती BUT ALSO हो सकता है किसी भी अतिरिक्त स्ट्रिंग को उत्पन्न करने के लिए कम्प्यूटेशनल रूप से अव्यावहारिक है जो समान हैश उत्पन्न करता है।
टाल जेफ

11
हां और नहीं ... अपने स्वयं के एप्लिकेशन की सुरक्षा के लिए हैश टकरावों को उत्पन्न करने के लिए कठिन होना चाहिए, लेकिन पासवर्ड रिसाव से बचने के लिए गैर-प्रतिवर्तीता पर्याप्त है।
डेव शेरोमैन

5
रेशमी: और वास्तव में आप अपने घटिया हैश फ़ंक्शन से मूल पासवर्ड कैसे प्राप्त करेंगे? मेरा सुझाव है कि आप डेव की टिप्पणी को फिर से पढ़ें
विंको वर्सालोविच

1
यदि कुछ भी, एक हैश फ़ंक्शन जिसमें बड़ी संख्या में टकराव होते हैं, तो पासवर्ड की सुरक्षा के लिए बेहतर है, हालांकि इसका स्पष्ट रूप से मतलब होगा कि खाते में लॉगिन करने के लिए अधिक पासवर्ड का उपयोग किया जा सकता है।
वियामीवीकरी

1
@ n00b नमक को हार्ड कोड नहीं किया जा सकता है क्योंकि हर हैशड आइटम को अलग नमक का उपयोग करना चाहिए। एक नमक की बात यह है कि अगर UserA और UserB दोनों पासवर्ड "1234" का उपयोग करते हैं, यदि आपको UserA का पासवर्ड पता चलता है, तो आप बता नहीं सकते कि UserB ने एक ही पासवर्ड का उपयोग किया क्योंकि उनके पास अलग-अलग लवण थे। यह सुरक्षा की दृष्टि से महत्वपूर्ण नहीं है कि एक लवण को गुप्त रखा जाता है, अधिकांश क्रियान्वयन सिर्फ नमक को आगे या बाइनरी बूँद के पिछले हिस्से पर स्थित है जो हैश का प्रतिनिधित्व करता है।
स्कॉट चैंबरलेन

34

हैशिंग एक-तरफ़ा फ़ंक्शन है, जिसका अर्थ है कि एक बार आपके पास एक पासवर्ड हैश से मूल पासवर्ड को वापस लाना बहुत मुश्किल है। एन्क्रिप्शन एक दो-तरफ़ा फ़ंक्शन है, जहाँ एन्क्रिप्टेड टेक्स्ट से मूल पाठ को वापस पाना बहुत आसान है।

प्लेन हैशिंग आसानी से एक शब्दकोश हमले का उपयोग करके पराजित किया जाता है, जहां एक हमलावर हर शब्द को शब्दकोष (या एक निश्चित लंबाई तक वर्णों के हर संयोजन) में हर शब्द से पहले प्री-हैश करता है, फिर हैशेड पासवर्ड देखने के लिए इस नए शब्दकोश का उपयोग करता है। संग्रहित प्रत्येक हैशेड पासवर्ड के लिए एक अद्वितीय यादृच्छिक नमक का उपयोग करना हमलावर के लिए इस पद्धति का उपयोग करना अधिक कठिन बनाता है। उन्हें मूल रूप से आपके द्वारा उपयोग किए जाने वाले प्रत्येक नमक मूल्य के लिए एक नया अनूठा शब्दकोश बनाने की आवश्यकता होगी, जो उनके हमले को बहुत धीमा कर देगा।

एन्क्रिप्शन एल्गोरिथ्म का उपयोग करके पासवर्ड को स्टोर करना असुरक्षित है क्योंकि अगर एन्क्रिप्टेड टेक्स्ट से यूजर या एडमिनिस्ट्रेटर के लिए मूल पासवर्ड वापस पाना आसान है, तो हमलावर के लिए भी ऐसा करना आसान है।


12

एन्क्रिप्टेड बनाम पासवर्ड वाले पासवर्ड

जैसा कि ऊपर की छवि में दिखाया गया है, अगर पासवर्ड एन्क्रिप्ट किया गया है तो यह हमेशा एक गुप्त रहस्य है जहां कोई व्यक्ति सादे पाठ पासवर्ड निकाल सकता है। हालाँकि जब पासवर्ड हैशेड होता है, तो आप आराम से होते हैं क्योंकि हैश मान से पासवर्ड को पुनर्प्राप्त करने का कोई तरीका नहीं होता है।


एन्क्रिप्टेड बनाम हशेड पासवर्ड से निकाला गया - कौन सा बेहतर है?

क्या एन्क्रिप्शन अच्छा है?

सादे पाठ पासवर्ड को डेस, एईएस या किसी अन्य एल्गोरिदम के साथ सममित एन्क्रिप्शन एल्गोरिदम का उपयोग करके एन्क्रिप्ट किया जा सकता है और डेटाबेस के अंदर संग्रहीत किया जा सकता है। प्रमाणीकरण में (उपयोगकर्ता नाम और पासवर्ड के साथ पहचान की पुष्टि), आवेदन डेटाबेस में संग्रहीत एन्क्रिप्टेड पासवर्ड को डिक्रिप्ट करेगा और समानता के लिए उपयोगकर्ता द्वारा प्रदान किए गए पासवर्ड के साथ तुलना करेगा। इस तरह के पासवर्ड हैंडलिंग दृष्टिकोण में, भले ही किसी को डेटाबेस टेबल तक पहुंच प्राप्त हो जाए, पासवर्ड बस पुन: प्रयोज्य नहीं होगा। हालाँकि इस दृष्टिकोण में एक बुरी खबर भी है। यदि किसी को आपके एप्लिकेशन द्वारा उपयोग की जाने वाली कुंजी के साथ क्रिप्टोग्राफ़िक एल्गोरिथ्म प्राप्त होता है, तो वह डिक्रिप्शन द्वारा आपके डेटाबेस में संग्रहीत सभी उपयोगकर्ता पासवर्डों को देख सकेगा। "यह एक सबसे अच्छा विकल्प है जो मुझे मिला", एक सॉफ्टवेयर डेवलपर चिल्ला सकता है, लेकिन क्या कोई बेहतर तरीका है?

क्रिप्टोग्राफिक हैश फ़ंक्शन (केवल एक-तरफा)

हाँ, हो सकता है कि आप यहाँ से चूक गए हों। क्या आपने देखा कि डिक्रिप्ट और तुलना करने की कोई आवश्यकता नहीं है? यदि एकतरफा-केवल रूपांतरण दृष्टिकोण है जहां पासवर्ड को कुछ परिवर्तित शब्द में परिवर्तित किया जा सकता है, लेकिन रिवर्स ऑपरेशन (परिवर्तित शब्द से पासवर्ड की पीढ़ी) असंभव है। अब भले ही किसी को डेटाबेस तक पहुंच प्राप्त हो, लेकिन ऐसा कोई तरीका नहीं है कि परिवर्तित शब्दों का उपयोग करके पासवर्ड को फिर से तैयार या निकाला जाए। इस दृष्टिकोण में, वैसे भी शायद ही कोई होगा जो आपके उपयोगकर्ताओं के शीर्ष गुप्त पासवर्डों को जान सके; और यह कई अनुप्रयोगों में एक ही पासवर्ड का उपयोग करने वाले उपयोगकर्ताओं की सुरक्षा करेगा। इस दृष्टिकोण के लिए क्या एल्गोरिदम का उपयोग किया जा सकता है?


ठीक है, लेकिन जब आप किसी सेवा में लॉग इन करते हैं, तो आपका पासवर्ड प्लेनटेक्स्ट / एन्क्रिप्टेड में भेजा जाता है, क्योंकि यदि इसे सर्वर के हैश के रूप में तुलना करने के लिए भेजा जाता है। एक हैकर अगर वे हैश को जानते हैं, तो बस हैश को सर्वर पर लॉगिन करने के लिए भेजें। यही कारण है कि तुलना के लिए पासवर्ड को सर्वर पर एन्क्रिप्ट करने के लिए भेजा जाना चाहिए, जहां वे डिक्रिप्ट और हैशेड हैं। यह सुरक्षित है? जब तक पासवर्ड को लंबे समय के लिए अनछुए रूप में संग्रहीत नहीं किया जाता है और एन्क्रिप्टेड / प्लेनटेक्स्ट पासवर्ड की सभी घटनाएं किसी भी मेमोरी से मिटा दी जाती हैं, जब ज़रूरत नहीं होती है?
AgentM

8

मैंने हमेशा सोचा है कि एन्क्रिप्शन को दोनों तरीकों से परिवर्तित किया जा सकता है, इस तरह से कि अंतिम मूल्य आपको मूल मूल्य पर ला सकता है और हाशिंग के साथ आप मूल परिणाम के अंतिम परिणाम से वापस नहीं आ पाएंगे।


8

हैशिंग एल्गोरिदम आमतौर पर प्रकृति में क्रिप्टोग्राफिक होते हैं, लेकिन मुख्य अंतर यह है कि एन्क्रिप्शन डिक्रिप्शन के माध्यम से प्रतिवर्ती है, और हैशिंग नहीं है।

एक एन्क्रिप्शन फ़ंक्शन आमतौर पर इनपुट लेता है और एन्क्रिप्टेड आउटपुट का उत्पादन करता है जो समान, या थोड़ा बड़ा आकार है।

एक हैशिंग फ़ंक्शन इनपुट लेता है और आमतौर पर छोटे आउटपुट का उत्पादन करता है, आमतौर पर एक निश्चित आकार का।

हालांकि यह मूल इनपुट वापस पाने के लिए एक हैशेड परिणाम और "dehash" लेना संभव नहीं है, आप आमतौर पर उसी तरह से हैश पैदा करने वाली किसी चीज़ के लिए अपने तरीके को बाध्य कर सकते हैं।

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

आम तौर पर टकराव की संभावना को कम करने के लिए हैशिंग फ़ंक्शंस बनाए जाते हैं और यह मुश्किल है कि किसी चीज़ की गणना करें जो समान हैश का उत्पादन करेगी।


4

आदर्श रूप से आपको दोनों करना चाहिए।

पहले एक तरह से सुरक्षा के लिए पास पासवर्ड को हैश करें। अतिरिक्त सुरक्षा के लिए एक नमक का उपयोग करें।

यदि पासवर्ड हैश के आपके डेटाबेस से समझौता किया जाता है, तो शब्दकोश के हमलों से बचाव के लिए हैश को एन्क्रिप्ट करें।


3
इसे किसके साथ एन्क्रिप्ट करें? यदि वे आपको इतनी मेहनत से पटाते हैं कि वे आपके सभी उपयोगकर्ता के पासवर्ड (हैशेड, एन्क्रिप्टेड या अन्यथा) के साथ डेटाबेस को मिल गए, तो क्या वे उन्हें डिक्रिप्ट करने की कुंजी नहीं ढूंढ पाएंगे?
ल्यूक

5
यह जोर से खारिज नहीं किया जाएगा। यह एक संभावना है जिसे उस आसान से इंकार नहीं किया जाना चाहिए, जबकि डेटाबेस समझौता नहीं है जबकि आवेदन नहीं है। इसलिए हैश को एन्क्रिप्ट करना सुरक्षा की एक अतिरिक्त परत है।
अरी

@ इससे मैं आपसे सहमत हूँ, मेरे पिछले स्व। मैंने बहुत सारे SQL-इंजेक्शन देखे हैं जो एप्लिकेशन कोड (या कॉन्फ़िगरेशन फ़ाइलों) से कोई समझौता नहीं करते थे और अब मैं राय देता हूं कि एक रहस्य जोड़ना मददगार है, यह एन्क्रिप्शन के रूप में या काली मिर्च के रूप में हो, लेकिन इसे हैशिंग की जगह नहीं लेना चाहिए । अधिक पूर्ण उत्तर के लिए, यहां देखें: security.stackexchange.com/a/31846/10863
Luc

3

हैशिंग :

यह एक तरह से एल्गोरिथ्म है और एक बार हैशड रोलबैक नहीं किया जा सकता है और यह एन्क्रिप्शन के खिलाफ इसका मीठा बिंदु है।

एन्क्रिप्शन

यदि हम एन्क्रिप्शन करते हैं, तो ऐसा करने के लिए एक कुंजी होगी। यदि यह कुंजी लीक हो जाएगी तो आपके सभी पासवर्ड आसानी से डिक्रिप्ट किए जा सकते हैं।

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

यदि आप एक नज़र रखना चाहते हैं कि आपको अपने हैश कार्यों को कैसे लिखना चाहिए, तो आप यहां जा सकते हैं

हैशिंग प्रदर्शन करने के लिए कई एल्गोरिदम हैं।

  1. MD5 - संदेश डाइजेस्ट एल्गोरिथ्म 5 (MD5) हैश फ़ंक्शन का उपयोग करता है। आउटपुट हैश की लंबाई 128 बिट है। MD5 एल्गोरिथ्म रॉन रिवेस्ट द्वारा 1990 के दशक की शुरुआत में डिजाइन किया गया था और आज एक पसंदीदा विकल्प नहीं है।

  2. SHA1 - 1995 में प्रकाशित सुरक्षा हैश एल्गोरिथम (SHA1) हैश का उपयोग करता है। आउटपुट हैश लंबाई में 160 बिट्स है। हालांकि सबसे अधिक व्यापक रूप से उपयोग किया जाता है, यह आज एक पसंदीदा विकल्प नहीं है।

  3. HMACSHA256 , HMACSHA384 , HMACSHA512 - SHA-2 परिवार के SHA-256, SHA-384 और SHA-512 का उपयोग करें। SHA-2 2001 में प्रकाशित किया गया था। हैश फ़ंक्शन के नाम इंगित करने के लिए आउटपुट हैश की लंबाई क्रमशः 256, 384 और 512 बिट्स है।


1

जैसा कि अन्य उत्तर सही हो सकते हैं, जिस संदर्भ में उद्धरण में था, हैशिंग एक उपकरण है जिसका उपयोग जानकारी हासिल करने में किया जा सकता है, एन्क्रिप्शन एक ऐसी प्रक्रिया है जो जानकारी लेती है और अनधिकृत लोगों के लिए इसे पढ़ना / उपयोग करना बहुत मुश्किल हो जाता है।


-9

यहाँ एक कारण है कि आप एक के बाद एक - पासवर्ड पुनर्प्राप्ति का उपयोग करना चाहते हैं।

यदि आप उपयोगकर्ता के पासवर्ड का केवल एक हैश स्टोर करते हैं, तो आप 'पासवर्ड भूल गए' सुविधा की पेशकश नहीं कर सकते।


16
आपने स्पष्ट रूप से स्वीकृत उत्तर को अच्छी तरह से नहीं पढ़ा है। ध्यान से पढ़ें: आपको पासवर्ड पुनर्प्राप्ति सुविधा की पेशकश नहीं करनी चाहिए आपको पासवर्ड रीसेट सुविधा की पेशकश करनी चाहिए । मैंने वर्षों तक कई वेबसाइटें संचालित की हैं, जिनमें vBulletin, phpBB, e107, IPB, blogspot और यहां तक ​​कि मेरे स्वयं के कस्टम-निर्मित CMS भी शामिल हैं। एक प्रशासक के रूप में आपको कभी भी किसी के पूर्व-हैशेड पासवर्ड की आवश्यकता नहीं होती है। तुम बस नहीं। और आपके पास यह नहीं होना चाहिए। यदि आप मेरे कहे से सहमत नहीं हैं, तो मैं आपको आश्वस्त करता हूं: आप गलत हैं।
लेकि

3
बहुत गुस्सा होने के बारे में क्षमा करें। मैं सिर्फ बहुत सी वेबसाइट्स को सादे पाठ में पासवर्ड स्टोर करता हूँ और यह मुझे निराश करता है। साइड नोट के रूप में: कुछ सुरक्षा-दिमाग वाली वेबसाइटें उपयोगकर्ताओं को समय-समय पर अपना पासवर्ड बदलना पसंद करती हैं। वे यह सुनिश्चित करना चाहते हैं कि व्यक्ति अपना पासवर्ड "पासवर्ड 1" से "पासवर्ड 2" में न बदले। इसलिए वे बाद की तारीख में इन तुलनाओं को करने के लिए सादे-पाठ पासवर्ड को बनाए रखते हैं। यह अच्छा अभ्यास नहीं है। उन्हें उस मामले में क्या करने की आवश्यकता है, पासवर्ड FIRST पर विश्लेषण करते हैं, समान पासवर्ड का एक गुच्छा बनाते हैं - प्रत्येक एक हैश - और केवल हैश को स्टोर करता है
झील

7
कोई समस्या नहीं है, इसने मुझे वापस जाने और प्रश्न को फिर से पढ़ने और आगे के शोध करने के लिए भी बनाया है, इसलिए सभी खो नहीं है :-) मुझे यकीन नहीं है कि मैं क्या सोच रहा था जब मैंने उस उत्तर को लिखा था। चीयर्स
फिल्ट्रॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.