
जादुई हैश – 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 उत्पन्न किए और यह तब से पूरे इंटरनेट पर फैल गया है। बस इसे गूगल करें।