PHP में Bcrypt: पासवर्ड को जल्दी और त्रुटि रहित तरीके से हैश कैसे करें
\n\nक्या आपने कभी सोचा है कि उपयोगकर्ताओं को पंजीकृत करते समय आपकी PHP साइट धीमी क्यों हो जाती है? या, इससे भी बुरा, हैकर्स अभी भी आपके डेटाबेस से पासवर्ड चुराने में क्यों कामयाब हो जाते हैं? इसका उत्तर इस बात में छिपा हो सकता है कि आप PHP में पासवर्ड हैश करने के लिए bcrypt का उपयोग कैसे करते हैं।
\n\nयह प्रश्न Stack Overflow पर सबसे लोकप्रिय प्रश्नों में से एक है (हज़ारों बार देखा गया!)। और इसमें कोई आश्चर्य नहीं: पासवर्ड सुरक्षा एक ऐसा विषय है जहाँ एक गलती आपकी प्रतिष्ठा और उपयोगकर्ताओं के डेटा को खर्च कर सकती है। लेकिन आज हम केवल bcrypt के साथ password_hash का उपयोग करने के तरीके पर चर्चा नहीं करेंगे। हम अनुकूलन और प्रदर्शन के बारे में बात करेंगे। क्योंकि, मान लीजिए, लॉगिन करते समय 5 सेकंड इंतजार करना अच्छा नहीं है।
आइए जानें कि PHP में पासवर्ड हैशिंग को न केवल सुरक्षित बल्कि तेज़ कैसे बनाया जाए। चलिए शुरू करते हैं!
\n\nbcrypt ही क्यों? और MD5 या SHA क्यों नहीं?
\n\nकई नौसिखिए (और, अफसोस, कुछ "अनुभवी") अभी भी md5() या sha1() का उपयोग करते हैं। यह एक दरवाजे को प्लास्टिक की कुंडी से बंद करने जैसा है - बंद तो है, लेकिन फूंक मारने पर खुल जाएगा। MD5 और SHA तेज़ हैश हैं। बहुत तेज़। आधुनिक GPU वाला हैकर प्रति सेकंड ऐसे अरबों हैश को ब्राउज़ कर सकता है।
Bcrypt एक मौलिक रूप से अलग दृष्टिकोण है। इसे विशेष रूप से धीमा बनाया गया है। यह "सॉल्ट" (यादृच्छिक डेटा) और "cost factor" (लागत कारक) का उपयोग करता है, जो एल्गोरिदम को अधिक समय तक चलने के लिए मजबूर करता है। जब हैकर एक bcrypt हैश की गणना करेगा, तब तक वह दस लाख MD5 हैश ब्राउज़ कर सकता था। यही कारण है कि bcrypt PHP के लिए डी-फैक्टो मानक है।
\n\nमूल बातें: PHP में bcrypt का सही उपयोग कैसे करें
\n\nPHP 5.5 से शुरू करके, हमारे पास जादुई फ़ंक्शन password_hash() है। मैन्युअल रूप से सॉल्ट जोड़ना और crypt() को कॉल करना भूल जाइए - सब कुछ आपके लिए पहले से ही किया जा चुका है।
यहाँ bcrypt के साथ सही पासवर्ड हैशिंग कैसा दिखता है:
\n\n<?php\n// पासवर्ड हैश करें\n$password = 'MySuperSecretPassword123!';\n$hash = password_hash($password, PASSWORD_BCRYPT);\n\necho $hash;\n// आउटपुट: $2y$10$... (60 वर्णों की स्ट्रिंग)\n?>\n\nबस! password_hash स्वयं एक यादृच्छिक सॉल्ट उत्पन्न करता है और एक इष्टतम cost factor (डिफ़ॉल्ट रूप से 10) चुनता है। और लॉगिन करते समय पासवर्ड कैसे जांचें?
<?php\n// पासवर्ड जांचें\n$inputPassword = 'MySuperSecretPassword123!';\n$hashFromDB = '$2y$10$...'; // डेटाबेस से वही हैश\n\nif (password_verify($inputPassword, $hashFromDB)) {\n echo "पासवर्ड सही है! स्वागत है।";\n} else {\n echo "गलत पासवर्ड। कृपया पुनः प्रयास करें।";\n}\n?>\n\nसरल है, है ना? लेकिन शैतान, हमेशा की तरह, विवरण में है। आइए सबसे महत्वपूर्ण चीज़ के बारे में बात करते हैं - प्रदर्शन।
\n\nbcrypt का अनुकूलन: सुरक्षा और गति के बीच संतुलन कैसे खोजें
\n\nमुख्य पैरामीटर जो PHP में bcrypt के प्रदर्शन को प्रभावित करता है वह है cost factor (लागत कारक)। इसे password_hash() में दूसरे तर्क के रूप में एक सरणी ['cost' => 12] के रूप में सेट किया जाता है।
cost क्या है? यह एक लघुगणकीय पैमाना है। प्रत्येक इकाई निष्पादन समय को लगभग 2 गुना बढ़ा देती है।
\n\n- \n
- Cost = 10 (डिफ़ॉल्ट): ~0.1-0.2 सेकंड। तेज़, लेकिन 2024 के लिए पर्याप्त नहीं है। \n
- Cost = 12: ~0.4-0.8 सेकंड। अधिकांश परियोजनाओं के लिए अच्छा संतुलन। \n
- Cost = 14: ~1.5-3 सेकंड। बहुत सुरक्षित, लेकिन उपयोगकर्ता घबराने लगेंगे। \n
- Cost = 16+: >5 सेकंड। केवल तभी जब आप जासूस हों या परमाणु कोड संग्रहीत कर रहे हों। \n
आदर्श cost कैसे चुनें? एक सरल नियम है: आपके सर्वर पर एक पासवर्ड हैश करने में 250-500 मिलीसेकंड से अधिक नहीं लगना चाहिए। यह उपयोगकर्ता के लिए अदृश्य है, लेकिन हैकर के लिए ब्रूट-फोर्स हमले को बहुत महंगा बना देता है।
\n\n