पासवर्ड निशाने पर: क्यों पुराने तरीके अब काम नहीं करते
\nकल्पना करें: आप एक डेवलपर हैं जो एक रजिस्ट्रेशन सिस्टम लिख रहे हैं। लगता है कि इससे आसान क्या हो सकता है? पासवर्ड लिया, md5 से पास किया, डेटाबेस में सेव कर दिया। लेकिन 2025 में ऐसा दृष्टिकोण — सीधे कमजोरी की ओर जाने वाला रास्ता है। आधुनिक हमले, GPU-ब्रूटफोर्स और रेनबो टेबल कमजोर हैश को सेकंडों में धूल में मिला देते हैं। Stack Overflow पर हज़ारों व्यूज़ वाला सवाल — «Secure hash and salt for PHP passwords» — अपनी प्रासंगिकता नहीं खोता है, और हम इसे हमेशा के लिए समझ लेंगे।
\nइस लेख में आप जानेंगे कि PHP में पासवर्ड को आधुनिक एल्गोरिदम, बिल्ट-इन फ़ंक्शन और सॉल्ट (salt) का उपयोग करके सही तरीके से कैसे हैश करें। हम शैक्षिक सामग्री के लिए समुदाय के सर्वश्रेष्ठ उत्तरों को अनुकूलित करेंगे और दिखाएंगे कि 2025 में भी उपयोगकर्ताओं की सुरक्षा कैसे करें।
\n\nmd5 और sha1 बुराई क्यों हैं
\nयदि आप अभी भी पासवर्ड स्टोर करने के लिए md5 या sha1 का उपयोग कर रहे हैं — तो रुक जाएँ। ये एल्गोरिदम गति के लिए बनाए गए हैं, सुरक्षा के लिए नहीं। 2025 में GPU प्रति सेकंड अरबों md5-हैश को क्रैक कर सकता है। सॉल्ट (रैंडम स्ट्रिंग) जोड़ने से बचाव नहीं होता: रेनबो टेबल को तो बायपास किया जा सकता है, लेकिन गति घातक बनी रहती है।
\n- \n
- Md5: 2^128 विकल्प — मिनटों में क्रैक हो जाता है। \n
- Sha1: थोड़ा बेहतर, लेकिन पुराना हो चुका है। \n
- धीमा किए बिना सॉल्ट: यदि हैश तेज़ है, तो सॉल्ट केवल हमले में देरी करता है। \n
इसके बजाय, «धीमा करने वाले» एल्गोरिदम की आवश्यकता है — जो समय और मेमोरी की मांग करते हैं। password_hash बिल्कुल इन्हीं का उपयोग करता है।
password_hash और password_verify: PHP से बिल्ट-इन समाधान
\nPHP 5.5 के साथ दो फ़ंक्शन आए जो पासवर्ड सुरक्षा की 90% समस्याओं को हल करते हैं: password_hash और password_verify। ये स्वचालित रूप से क्रिप्टोग्राफिक रूप से सुरक्षित सॉल्ट उत्पन्न करते हैं और ब्रूटफोर्स-प्रतिरोधी एल्गोरिदम का उपयोग करते हैं। 2025 में यह मानक है, और कोई स्व-निर्मित समाधान नहीं!
यह कैसे काम करता है?
\nफ़ंक्शन password_hash पासवर्ड और एल्गोरिदम (डिफ़ॉल्ट रूप से — bcrypt, लेकिन आप argon2 भी निर्दिष्ट कर सकते हैं) लेता है। यह एक स्ट्रिंग लौटाता है जिसमें पहले से ही सॉल्ट और पैरामीटर शामिल होते हैं। आपको सॉल्ट को अलग से स्टोर करने की आवश्यकता नहीं है — यह हैश के अंदर ही होता है।
<?php\n// पासवर्ड हैश करें\n$password = "SuperSecret123!";\n$hash = password_hash($password, PASSWORD_DEFAULT);\n\necho $hash; // $2y$10$... (60 वर्ण)\n?>\n\nअब लॉगिन करते समय पासवर्ड जाँचें:
\n<?php\n$inputPassword = "SuperSecret123!";\n$storedHash = "$2y$10$..."; // डेटाबेस से\n\nif (password_verify($inputPassword, $storedHash)) {\n echo "पासवर्ड सही है!";\n} else {\n echo "गलत पासवर्ड।";\n}\n?>\n\nसब कुछ सरल और शानदार है। password_verify स्वचालित रूप से हैश से सॉल्ट निकालता है और पासवर्ड जाँचता है। कोई अतिरिक्त कार्रवाई नहीं।
एल्गोरिदम का चयन: bcrypt बनाम argon2
\n2025 में आपके पास दो मुख्य विकल्प हैं:
\n- \n
- Bcrypt (PASSWORD_BCRYPT): समय-परीक्षित, डिफ़ॉल्ट रूप से उपयोग किया जाता है। हमलों के प्रति प्रतिरोधी, लेकिन cost factor को कॉन्फ़िगर करने की आवश्यकता है। \n
- Argon2 (PASSWORD_ARGON2I या PASSWORD_ARGON2ID): Password Hashing Competition का विजेता। अधिक आधुनिक, अधिक मेमोरी की आवश्यकता होती है, जिससे GPU हमले कठिन हो जाते हैं। नई परियोजनाओं के लिए अनुशंसित। \n
argon2 के साथ उदाहरण:
\n<?php\n$hash = password_hash($password, PASSWORD_ARGON2ID, [\n 'memory_cost' => 1 << 17, // 128 MB\n 'time_cost' => 4,\n 'threads' => 2\n]);\n?>\n\nपैरामीटर memory_cost — किलोबाइट में मेमोरी की मात्रा। जितना अधिक, उतना सुरक्षित, लेकिन धीमा। प्रोडक्शन के लिए अपने सर्वर पर परीक्षण करें।
सॉल्ट (salt): यह कैसे काम करता है और अलग से इसकी आवश्यकता क्यों नहीं है
\nकई शुरुआती पूछते हैं: «मैन्युअल रूप से सॉल्ट कैसे जोड़ें?»। उत्तर: बिल्कुल नहीं। password_hash (bcr के लिए 22 वर्णों का रैंडम सॉल्ट उत्पन्न करता है