
जादुई हैश – PHP हैश "टकराव"
पासवर्ड 1 से रजिस्टर करें और फिर पासवर्ड 2 से साइन इन करें। यदि आप अंदर आ जाते हैं तो स्टोरेज पासवर्ड को हैश करने के लिए निर्दिष्ट एल्गोरिदम का उपयोग करता है और PHP उनकी तुलना करने के लिए == का उपयोग करता है (MD5, SHA-1 और प्लेनटेक्स्ट के लिए)।
MD5, SHA-1 और SHA-2 परिवार के लिए, यह लंबे समय से ज्ञात ट्रिक का उपयोग करता है (यह वास्तव में एक प्रलेखित सुविधा है, देखें PHP type comparison tables और Floating point numbers) कि PHP के लिए '0e1' == '00e2' == '0' होता है, यह इसे केवल व्यावहारिक उद्देश्यों के लिए उपयोग करता है। कोई भी पासवर्ड सूची के किसी भी अन्य पासवर्ड से मेल खाता है। यह इंटीग्रल स्ट्रिंग्स द्वारा फ्लोटिंग पॉइंट नंबरों में ओवरफ्लो से अलग ट्रिक है, बस इन दो पंक्तियों के बीच का अंतर देखें।
ये सभी एल्गोरिदम हैं जिनमें मैजिक हैश हैं:
md5(md5(password))@0xb0bb को उद्धृत करने के लिए, "पासवर्ड तुलना के अलावा मैजिक हैश के अन्य अनुप्रयोग भी हैं (जैसे कैशिंग परतें या हैश फ़ंक्शन के आउटपुट से प्राप्त डेटा) जहां ये ज्ञात असुरक्षित, कम ज्ञात और छद्म-हैश एल्गोरिदम अधिक आसानी से पाए जा सकते हैं।"
प्लेनटेक्स्ट के लिए, यह विभिन्न रूपांतरण ट्रिक्स का उपयोग करता है। पहला पासवर्ड केवल दूसरे से मेल खाएगा। ट्रिक्स उन PHP संस्करणों के आधार पर समूहीकृत हैं जो उन्हें अनुमति देते हैं।
bcrypt पासवर्ड को अधिकतम 72 वर्णों की लंबाई तक छोटा (truncate) कर देता है। यदि दोनों पासवर्डों के पहले 72 वर्ण मेल खाते हैं तो पासवर्ड मेल खाते हैं।
descrypt (पारंपरिक UNIX DES crypt) पासवर्ड को अधिकतम 8 वर्णों की लंबाई तक छोटा कर देता है। यदि दोनों पासवर्डों के पहले 8 वर्ण मेल खाते हैं तो पासवर्ड भी मेल खाते हैं, "सामान्य क्रॉस-चेक" अनुभाग देखें।
यदि आप 64 बाइट्स से अधिक लंबे पासवर्ड का उपयोग करते हैं और इसे PBKDF2-HMAC-SHA1 के साथ हैश करते हैं, तो इसे पहले SHA1 के साथ प्री-हैश किया जाता है, इसलिए PBKDF2-HMAC-SHA1(password1) === PBKDF2-HMAC-SHA1(password2) क्योंकि sha1(password1) === bin2hex(password2) होता है। PBKDF2-HMAC-SHA224 और PBKDF2-HMAC-SHA256 के मामले में भी इसी तरह का प्री-हैशिंग लागू किया जाता है।
अभी Norbert Tihanyi के कारण प्रत्येक में केवल एक मैजिक हैश है, उम्मीद है कि भविष्य में और जोड़े जाएंगे।
PHP में किसी भी चीज़* की तुलना करते समय == के बजाय === का उपयोग करें। और PHP में पासवर्ड हैशिंग के लिए password_hash() और password_verify() का उपयोग करें, MD5 या SHA-1 का नहीं। हैश की तुलना करते समय hash_equals() का उपयोग करें।
यह सब इस ट्वीट से शुरू हुआ, मैंने फरवरी 2014 में QNKCDZO और 240610708 उत्पन्न किए और यह तब से पूरे इंटरनेट पर फैल गया है। बस इसे गूगल करें।
मैंने 2014 में अपना लैपटॉप, कुछ for (या foreach?) लूप, कई CPU साइकिल और एक बाहरी पंखा इस्तेमाल किया था लेकिन आज आप इसके लिए GPU और एक संशोधित hashcat का उपयोग कर सकते हैं/करना चाहिए। Carl Löndahl और 0xb0bb द्वारा यह लेख देखें।
Chick3nman और साथी भी hashcat के अपने संस्करण पर काम कर रहे हैं, बने रहें।
यदि आपको वास्तविक अल्फ़ान्यूमेरिकल टकराव की आवश्यकता है, तो यहां Marc Stevens द्वारा 72-बाइट अल्फ़ानम MD5 टकराव है जिसमें 1-बाइट अंतर, यहां तक कि 1-बिट अंतर है:
md5("TEXTCOLLBYfGiJUETHQ4hAcKSMd5zYpgqf1YRDhkmxHkhPWptrkoyz28wnI9V0aHeAuaKnak")
=
md5("TEXTCOLLBYfGiJUETHQ4hEcKSMd5zYpgqf1YRDhkmxHkhPWptrkoyz28wnI9V0aHeAuaKnak")
ध्यान दें कि यदि आप पहले पासवर्ड से रजिस्टर करते हैं, और दूसरे से लॉग इन करते हैं, तो इसका मतलब यह हो सकता है कि साइट bcrypt(md5($password)) का उपयोग कर रही है, न कि केवल md5($password)। इस तरह का हैश रैपिंग कभी-कभी पासवर्ड हैशिंग को अपग्रेड करते समय उपयोग किया जाता है लेकिन इसका उपयोग केवल अस्थायी रूप से किया जाना चाहिए।
यदि आप इन वास्तविक टकरावों में रुचि रखते हैं या अपना खुद का बनाना चाहते हैं तो Marc का Project HashClash देखें।
@solardiz द्वारा वास्तविक LM हैश टकराव (#35, धन्यवाद!):
db82323cb0693862: 2275490 या 0/*LUZ@44b3b60db75c15c1: 2716388 या 1}DC<XT585e239d32df1998: 8351762 या $;)5D|Xऔर कुछ उत्पन्न करने का तरीका जानने के लिए ट्वीट देखें।