इसके विपरीत जो सबसे अधिक उत्तोलित किए गए उत्तर हैं, उन पर जोर देते हैं, गैर-इंजेक्शन (यानी कि एक ही मूल्य के कई स्ट्रिंग्स हैंशिंग हैं) क्रिप्टोग्राफिक हैश फ़ंक्शन के कारण बड़े (संभावित अनंत) इनपुट आकार और निश्चित आउटपुट आकार के बीच का अंतर नहीं है महत्वपूर्ण बिंदु - वास्तव में, हम हैश फ़ंक्शंस पसंद करते हैं जहां उन टकराव संभव के रूप में शायद ही कभी होते हैं।
इस फ़ंक्शन पर विचार करें (सवाल के रूप में PHP संकेतन में):
function simple_hash($input) {
return bin2hex(substr(str_pad($input, 16), 0, 16));
}
यह कुछ स्थानों को जोड़ता है, यदि स्ट्रिंग बहुत कम है, और फिर स्ट्रिंग के पहले 16 बाइट्स लेता है, तो इसे हेक्साडेसिमल के रूप में एन्कोड करता है। यदि एमडी 2 हैश (32 हेक्साडेसिमल वर्ण या 16 बाइट्स के रूप में हम बिन 2 हेक्स भाग को छोड़ते हैं) तो इसका आउटपुट आकार एक ही है।
print simple_hash("stackoverflow.com");
यह आउटपुट होगा:
737461636b6f766572666c6f772e636f6d
इस फ़ंक्शन में MD5 के लिए कोडी के उत्तर द्वारा हाइलाइट किए गए गैर-इंजेक्शन गुण भी हैं: हम किसी भी आकार के स्ट्रिंग्स में गुजर सकते हैं (जब तक वे हमारे कंप्यूटर में फिट होते हैं), और यह केवल 32 हेक्स-अंकों का उत्पादन करेगा। बेशक यह इंजेक्शन नहीं हो सकता।
लेकिन इस मामले में, यह एक स्ट्रिंग खोजने के लिए तुच्छ है जो एक ही हैश पर मैप करता है (बस hex2bin
आपके हैश पर लागू होता है , और आपके पास यह है)। यदि आपके मूल स्ट्रिंग की लंबाई 16 थी (हमारे उदाहरण के रूप में), तो आपको यह मूल स्ट्रिंग भी मिल जाएगी। एमडी 5 के लिए इस तरह का कुछ भी संभव नहीं होना चाहिए, भले ही आपको पता हो कि इनपुट की लंबाई काफी कम थी (अन्य संभावित इनपुटों को आज़माकर जब तक कि हम एक मेल नहीं खाते हैं, उदाहरण के लिए एक क्रूर बल हमला)।
क्रिप्टोग्राफ़िक हैश फ़ंक्शन के लिए महत्वपूर्ण धारणाएँ हैं:
- किसी भी हैश (प्रीमीज रेजिस्टेंस) को पैदा करने वाली किसी भी स्ट्रिंग को ढूंढना मुश्किल है
- किसी भी अलग स्ट्रिंग को दिए गए स्ट्रिंग के समान हैश का उत्पादन करना मुश्किल है (दूसरा प्रीइमेज प्रतिरोध)
- एक ही हैश (टक्कर प्रतिरोध) के साथ तार की किसी भी जोड़ी को खोजना मुश्किल है
जाहिर है कि मेरा simple_hash
कार्य इन शर्तों में से किसी को पूरा नहीं करता है। (वास्तव में, यदि हम इनपुट स्पेस को "16-बाइट स्ट्रिंग्स" तक सीमित रखते हैं, तो मेरा फ़ंक्शन इंजेक्टिव हो जाता है, और इस तरह यह दूसरे-प्राइमेज रेसिस्टेंट और टकराव प्रतिरोधी भी साबित होता है।)
अब एमडी 5 के खिलाफ टक्कर के हमले मौजूद हैं (उदाहरण के लिए, एक दिए गए समान उपसर्ग के साथ भी तार की एक जोड़ी का उत्पादन करना संभव है, जिसमें समान हैश है, कुछ काम के साथ, लेकिन असंभव बहुत काम नहीं है), इसलिए आपको उपयोग नहीं करना चाहिए कुछ भी महत्वपूर्ण के लिए MD5। अभी तक प्रिमिज अटैक नहीं हुआ है, लेकिन हमले बेहतर होंगे।
वास्तविक प्रश्न का उत्तर देने के लिए:
इन कार्यों के बारे में ऐसा क्या है जो परिणामी तारों को वापस करने के लिए असंभव बनाता है?
MD5 (और अन्य हैश फ़ंक्शन मर्कले-डैमगार्ड निर्माण पर प्रभावी रूप से बनाते हैं) प्रभावी रूप से संदेश के साथ एन्क्रिप्शन एल्गोरिथ्म को लागू कर रहा है और कुछ निश्चित मान "सादे पाठ" के रूप में है, जिसके परिणामस्वरूप हैश के रूप में सिफरटेक्स्ट का उपयोग किया जाता है। (इससे पहले, इनपुट को गद्देदार और ब्लॉकों में विभाजित किया जाता है, इस ब्लॉक के प्रत्येक का उपयोग पिछले ब्लॉक के आउटपुट को एन्क्रिप्ट करने के लिए किया जाता है, रिवर्स गणना को रोकने के लिए अपने इनपुट के साथ XORed।)
आधुनिक एन्क्रिप्शन एल्गोरिदम (हैश फ़ंक्शन में उपयोग किए जाने वाले सहित) कुंजी को पुनर्प्राप्त करने के लिए कठिन बनाने के लिए बनाए गए हैं, यहां तक कि दोनों प्लेनटेक्स्ट और सिफरटेक्स्ट (या यहां तक कि जब विरोधी उनमें से किसी एक को चुनता है) दिया जाता है। वे आम तौर पर बहुत सारे बिट-शफलिंग ऑपरेशंस को इस तरह से करते हैं कि प्रत्येक आउटपुट बिट प्रत्येक कुंजी बिट (कई बार) और प्रत्येक इनपुट बिट द्वारा भी निर्धारित होता है। इस तरह से आप केवल आसानी से वही कर सकते हैं जो पूर्ण कुंजी और इनपुट या आउटपुट को जानते हैं।
MD5 जैसे हैश फ़ंक्शंस और एक प्रीइमेज अटैक (सिंगल-ब्लॉक हैशेड स्ट्रिंग के साथ, चीजों को आसान बनाने के लिए), आपके पास केवल अपने एन्क्रिप्शन फ़ंक्शन का इनपुट और आउटपुट है, लेकिन कुंजी नहीं (यह वही है जो आप खोज रहे हैं)।