PHP में Bcrypt: पासवर्ड को सही और तेज़ी से हैश कैसे करें
\n\nअगर आपने कभी सोचा है कि "PHP में पासवर्ड हैश करने के लिए bcrypt का उपयोग कैसे करें?", तो आप अकेले नहीं हैं। यह सवाल Stack Overflow पर हज़ारों बार देखा जा चुका है — और यह सही भी है। पासवर्ड हैशिंग किसी भी वेब एप्लिकेशन की सुरक्षा की नींव है, और bcrypt अब भी सबसे भरोसेमंद और लोकप्रिय एल्गोरिदम में से एक है। इस लेख में हम जानेंगे कि PHP में bcrypt का उपयोग कैसे करें, इसे अधिकतम परफॉरमेंस के लिए कैसे सेट करें, और किन गलतियों से बचना चाहिए।
\n\nbcrypt ही क्यों? क्योंकि यह बिल्ट-इन "सॉल्ट" और एडजस्टेबल कॉम्प्लेक्सिटी के कारण brute-force अटैक के प्रति प्रतिरोधी है। लेकिन यह कैसे सुनिश्चित करें कि हर लॉगिन पर आपकी साइट धीमी न हो? यही हम चर्चा करेंगे।
\n\nbcrypt क्या है और यह MD5 या SHA1 से बेहतर क्यों है?
\n\nचलिए एक बात साफ कर दें: पासवर्ड हैश करने के लिए कभी भी MD5 या SHA1 का उपयोग न करें। ये एल्गोरिदम तेज़ गणना के लिए बनाए गए हैं, सुरक्षा के लिए नहीं। इसके विपरीत, bcrypt को जानबूझकर धीमा डिज़ाइन किया गया है। यह cost factor (लागत कारक) का उपयोग करता है, जो यह निर्धारित करता है कि हैशिंग के कितने इटरेशन होंगे। cost factor जितना अधिक होगा, हैश उतना ही धीमा होगा — और हैकर के लिए पासवर्ड का अनुमान लगाना उतना ही मुश्किल होगा।
\n\nPHP में bcrypt के साथ काम करना password_hash() और password_verify() फंक्शन की बदौलत बेहद आसान हो गया है। ये PHP 5.5 में आए थे और तब से डी-फैक्टो स्टैंडर्ड बन गए हैं।
PHP में bcrypt का उपयोग कैसे करें: बुनियादी उदाहरण
\n\nचलिए सरल शुरुआत करते हैं। यहां बताया गया है कि कैसे एक यूज़र को रजिस्टर करें और उसका पासवर्ड सेव करें:
\n\n<?php\n// यूज़र रजिस्ट्रेशन\n$password = "MySuperP@ss123";\n$hash = password_hash($password, PASSWORD_BCRYPT);\n\n// $hash को डेटाबेस में सेव करें (जैसे, password_hash फील्ड में)\necho $hash; // कुछ इस तरह आउटपुट देगा $2y$10$...\n?>\n\nऔर यहां बताया गया है कि लॉगिन करते समय पासवर्ड कैसे चेक करें:
\n\n<?php\n// यूज़र लॉगिन\n$loginPassword = "MySuperP@ss123";\n$storedHash = "$2y$10$..."; // डेटाबेस से\n\nif (password_verify($loginPassword, $storedHash)) {\n echo "पासवर्ड सही है!";\n} else {\n echo "गलत पासवर्ड।";\n}\n?>\n\nबहुत आसान है, है ना? लेकिन असली चीज़ डिटेल्स में छिपी है। आइए cost factor को समझते हैं।
\n\nCost Factor सेट करना: सुरक्षा और गति के बीच संतुलन
\n\nडिफ़ॉल्ट रूप से, PASSWORD_BCRYPT cost factor = 10 का उपयोग करता है। इसका मतलब है 2^10 = 1024 इटरेशन। एक आधुनिक सर्वर पर, इसमें लगभग 0.1–0.2 सेकंड लगते हैं। यह थोड़ा लगता है, लेकिन अगर आपके पास 1000 एक साथ लॉगिन हैं — तो समय बढ़ने लगेगा।
सही cost factor कैसे चुनें? एक सरल नियम है: यह इतना होना चाहिए कि आपके सर्वर पर एक पासवर्ड को हैश करने में 0.5 सेकंड से अधिक न लगे। आप अलग-अलग मानों के साथ password_hash() फंक्शन का उपयोग करके इसका परीक्षण कर सकते हैं।
यहां परफॉरमेंस टेस्ट का एक उदाहरण है:
\n\n<?php\n$password = "test_password";\n$times = [];\n\nfor ($cost = 8; $cost <= 14; $cost++) {\n $start = microtime(true);\n password_hash($password, PASSWORD_BCRYPT, ['cost' => $cost]);\n $times[$cost] = microtime(true) - $start;\n}\n\nprint_r($times);\n?>\n\nएक सामान्य shared-होस्टिंग पर, cost factor 10–12 सबसे उपयुक्त होगा। अगर आपके पास शक्तिशाली सर्वर है, तो इसे 13–14 तक बढ़ा सकते हैं। लेकिन ज़्यादा न करें: बहुत अधिक cost factor के कारण अटैक के दौरान आपका सर्वर सारे संसाधन हैशिंग में खर्च कर सकता है।
\n\nPHP में bcrypt परफॉरमेंस ऑप्टिमाइज़ेशन
\n\nअब सबसे दिलचस्प भाग पर आते हैं — सुरक्षा से समझौता किए बिना bcrypt को तेज़ कैसे बनाएं। यहां कुछ सिद्ध रणनीतियाँ दी गई हैं:
\n\n1. परिणामों को कैश करना
\nअगर यूज़र सही पासवर्ड डालता है, तो हर रिक्वेस्ट पर इसे फिर से हैश क्यों करें? आप Redis या Memcached का उपयोग करके थोड़े समय (जैसे, 5 मिनट) के लिए परिणाम को कैश कर सकते हैं। यह विशेष रूप से