bcrypt हैश को "डिक्रिप्ट" नहीं किया जा सकता: यह जानने के लिए कि पासवर्ड सही है या नहीं, सत्यापित मोड का उपयोग करें। सारी गणना आपके ब्राउज़र में होती है और पासवर्ड किसी सर्वर पर नहीं भेजा जाता।
मौजूदा संस्करण। इसे OpenBSD, Node.js, Python, Go और Rust जेनरेट करते हैं।
लागत का हर अंक गणना का समय दोगुना कर देता है। OWASP कम से कम 10 की सलाह देता है; आदर्श वह सबसे ऊँचा मान है जिसे आपका सर्वर लगभग 250 ms में गणना कर सके।
यह कैसे काम करता है
bcrypt पासवर्ड संग्रहीत करने के लिए बनाया गया एक हैश फ़ंक्शन है। SHA-256 या MD5 के विपरीत, जिनकी गणना माइक्रोसेकंड में हो जाती है, bcrypt जानबूझकर धीमा है: इसलिए जो कोई डेटाबेस चुराता है, उसे ब्रूट फ़ोर्स से पासवर्ड आज़माने में वर्षों लगते हैं।
हर हैश में उसे सत्यापित करने के लिए ज़रूरी सब कुछ होता है: एल्गोरिथम का संस्करण, लागत और 128 बिट का एक यादृच्छिक salt। इसलिए एक ही पासवर्ड हर बार अलग हैश देता है और salt को अलग से संग्रहीत करने की ज़रूरत नहीं होती।
लागत राउंड की संख्या का आधार 2 वाला लघुगणक है: लागत 10 पर 1024 राउंड और 12 पर 4096 राउंड की गणना होती है। एक अंक बढ़ाने से गणना का समय दोगुना हो जाता है, जिससे एल्गोरिथम बदले बिना हार्डवेयर की बढ़ती शक्ति के साथ चला जा सकता है।
उदाहरण
rasmuslerdorf$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1aPHP मैनुअल का password_verify() उदाहरण: इसे इसी पासवर्ड के साथ सत्यापित मोड में पेस्ट करें और यह मेल खाएगा।abc$2a$06$If6bvum7DFjUnE9p2uDeDu0YHzrHM6tf.iqN8.yx.jNN1ILEf7h0iलागत 6 वाला jBCrypt का एक परीक्षण वेक्टर। लागत के बाद के पहले 22 वर्ण salt हैं; बाकी 31 परिणाम हैं।उपयोग के मामले
- किसी एडमिन उपयोगकर्ता के प्रारंभिक पासवर्ड का हैश बनाना ताकि उसे सीधे डेटाबेस में डाला जा सके।
- जब कोई उपयोगकर्ता लॉग इन न कर पाए, तब जाँचना कि पासवर्ड संग्रहीत हैश से मेल खाता है या नहीं।
- Laravel, Spring, Django या Node.js एप्लिकेशन के fixtures, seeds या स्वचालित परीक्षणों के लिए परीक्षण हैश जेनरेट करना।
- सर्वर पर कॉन्फ़िगर करने से पहले उपयुक्त मान चुनने के लिए मापना कि हर लागत में कितना समय लगता है।
- Apache की .htpasswd फ़ाइलों के लिए प्रविष्टियाँ बनाना, जो $2y$ उपसर्ग वाले bcrypt हैश स्वीकार करती हैं।
अक्सर पूछे जाने वाले प्रश्न
क्या bcrypt हैश को डिक्रिप्ट किया जा सकता है?
नहीं। bcrypt एकतरफ़ा फ़ंक्शन है: हैश से पासवर्ड प्राप्त करने का कोई तरीका नहीं है। केवल इतना संभव है कि संभावित पासवर्ड आज़माकर देखा जाए कि कोई मेल खाता है या नहीं, और bcrypt ठीक इसी को धीमा बनाता है।
$2a$, $2b$ और $2y$ में क्या अंतर है?
सामान्य पासवर्ड के लिए तीनों एक ही परिणाम निकालते हैं। $2a$ मूल संस्करण है; $2y$ को PHP ने 2011 में अपने हैश को एक त्रुटिपूर्ण कार्यान्वयन के हैश से अलग करने के लिए शुरू किया; $2b$ को OpenBSD ने 2014 में 255 वर्णों से लंबे पासवर्ड से जुड़ी एक अन्य त्रुटि ठीक करते समय अपनाया। लगभग सभी लाइब्रेरी सत्यापन के समय तीनों को स्वीकार करती हैं।
कौन-सी लागत इस्तेमाल करनी चाहिए?
OWASP कम से कम 10 की सलाह देता है। आदर्श वह सबसे ऊँचा मान है जिसे आपका सर्वर प्रति लॉग इन लगभग 250 ms में गणना कर सके। Spring Security डिफ़ॉल्ट रूप से 10 का उपयोग करता है; Laravel 11 और PHP 8.4 ने अपना मान बढ़ाकर 12 कर दिया।
bcrypt 72 बाइट से आगे का हिस्सा क्यों अनदेखा करता है?
एल्गोरिथम पासवर्ड को Blowfish कुंजी के रूप में उपयोग करता है, जो अधिकतम 72 बाइट स्वीकार करती है। बाकी हिस्सा बिना चेतावनी के हटा दिया जाता है, इसलिए पहले 72 बाइट समान रखने वाले दो पासवर्ड एक ही हैश देते हैं। देवनागरी अक्षर तीन बाइट और इमोजी चार बाइट तक घेरते हैं, इसीलिए टूल वर्ण नहीं बल्कि बाइट गिनता है।
bcrypt बेहतर है या Argon2?
आज नए सिस्टम के लिए Argon2id अनुशंसित एल्गोरिथम है, क्योंकि धीमा होने के साथ-साथ यह बहुत मेमोरी भी उपयोग करता है, जिससे GPU हमले महँगे हो जाते हैं। फिर भी उपयुक्त लागत के साथ bcrypt सुरक्षित बना रहता है और PHP, Laravel, Spring और Ruby on Rails में डिफ़ॉल्ट है।
क्या मेरा पासवर्ड किसी सर्वर पर भेजा जाता है?
नहीं। हैश और सत्यापन आपके ब्राउज़र में गणना किए जाते हैं और पासवर्ड कभी आपके डिवाइस से बाहर नहीं जाता; इसे टूल साझा करने वाले लिंक में भी शामिल नहीं किया जाता।