Bcrypt में अंतर्निहित लवण कैसे हो सकते हैं?


616

कोडा हेल का लेख "हाउ टू सेफली स्टोर ए पासवर्ड" का दावा है कि:

bcrypt में रेनबो टेबल हमलों को रोकने के लिए अंतर्निहित लवण हैं।

वह इस पत्र का हवाला देते हैं , जो कहता है कि ओपनबीएसडी के कार्यान्वयन में bcrypt:

OpenBSD एक आर्कफॉर (arc4random (3)) कुंजी स्ट्रीम से 128-बिट bcrypt नमक उत्पन्न करता है, यादृच्छिक डेटा के साथ वरीयता प्राप्त कर्नेल डिवाइस के समय से एकत्र करता है।

मुझे समझ नहीं आता कि यह कैसे काम कर सकता है। एक नमक की मेरी अवधारणा में:

  • इसे प्रत्येक संग्रहीत पासवर्ड के लिए अलग-अलग होना चाहिए, ताकि प्रत्येक के लिए एक अलग इंद्रधनुष तालिका बनानी पड़े
  • इसे कहीं संग्रहीत करने की आवश्यकता है ताकि यह दोहराए जा सके: जब कोई उपयोगकर्ता लॉग इन करने का प्रयास करता है, तो हम उनका पासवर्ड लेने का प्रयास करते हैं, उसी नमक-और-हैश प्रक्रिया को दोहराते हैं, जब हमने मूल रूप से अपना पासवर्ड संग्रहीत किया था, और तुलना करें

जब मैं bcrypt के साथ Devise (एक रेल लॉगिन प्रबंधक) का उपयोग कर रहा हूं, तो डेटाबेस में कोई नमक स्तंभ नहीं है, इसलिए मैं भ्रमित हूं। यदि नमक यादृच्छिक है और कहीं भी संग्रहीत नहीं है, तो हम मज़बूती से हैशिंग प्रक्रिया को कैसे दोहरा सकते हैं?

संक्षेप में, bcrypt में अंतर्निहित लवण कैसे हो सकते हैं ?

जवाबों:


789

यह bcrypt है:

एक यादृच्छिक नमक उत्पन्न करें। एक "लागत" कारक पूर्व-कॉन्फ़िगर किया गया है। एक पासवर्ड लीजिए।

नमक और लागत कारक का उपयोग करके पासवर्ड से एक एन्क्रिप्शन कुंजी प्राप्त करें। एक प्रसिद्ध स्ट्रिंग को एन्क्रिप्ट करने के लिए इसका उपयोग करें। स्टोर लागत, नमक, और सिफर पाठ। क्योंकि इन तीन तत्वों की एक ज्ञात लंबाई है, इसलिए उन्हें संक्षिप्त करना और उन्हें एक ही क्षेत्र में संग्रहीत करना आसान है, फिर भी बाद में अलग करने में सक्षम हैं।

जब कोई प्रमाणित करने की कोशिश करता है, तो संग्रहीत लागत और नमक को पुनः प्राप्त करता है। इनपुट पासवर्ड, लागत और नमक से एक कुंजी प्राप्त करें। उसी प्रसिद्ध स्ट्रिंग को एन्क्रिप्ट करें। यदि उत्पन्न सिफर पाठ संग्रहीत सिफर पाठ से मेल खाता है, तो पासवर्ड एक मेल है।

PBKDF2 जैसे एल्गोरिदम के आधार पर Bcrypt बहुत ही पारंपरिक तरीके से संचालित होता है। मुख्य अंतर ज्ञात सादे पाठ को एन्क्रिप्ट करने के लिए व्युत्पन्न कुंजी का उपयोग है; अन्य योजनाएं (यथोचित) मान लें कि मुख्य व्युत्पत्ति समारोह अपरिवर्तनीय है, और व्युत्पन्न कुंजी को सीधे स्टोर करें।


डेटाबेस में संग्रहीत, bcrypt"हैश" कुछ इस तरह दिख सकता है:

$ 2 ए $ 10 $ vI8aWBnW3fID.ZQ4 / zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa

यह वास्तव में "$" द्वारा सीमांकित तीन क्षेत्र हैं:

  • 2abcryptउपयोग किए गए एल्गोरिथ्म संस्करण की पहचान करता है।
  • 10लागत कारक है; कुंजी व्युत्पत्ति समारोह के 2 10 पुनरावृत्तियों का उपयोग किया जाता है (जो कि पर्याप्त नहीं है, वैसे मैं 12 या अधिक की लागत की सिफारिश करूंगा।)
  • vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTaनमक और सिफर पाठ, एक संशोधित बेस -64 में संक्षिप्त और एन्कोडेड है। नमक के लिए पहले 22 अक्षर 16-बाइट मान के लिए डिकोड होते हैं। शेष अक्षर प्रमाणीकरण के लिए तुलना करने के लिए सिफर पाठ हैं।

यह उदाहरण कोडा हेल के रूबी कार्यान्वयन के लिए प्रलेखन से लिया गया है


7
क्या आपके पास अधिक विवरण होगा कि 10 का लागत कारक पर्याप्त क्यों नहीं होगा? ग्रिल्स में, मैंने देखा कि 10 bcrypt के लिए लागत कारक / लॉग राउंड के लिए डिफ़ॉल्ट मान है, इसलिए यह आपके सुझाव को अपडेट करने के लायक हो सकता है।
pm_labs

57
Bcrypt के लिए लागत कारक घातीय है, या यों कहें कि, 10 का लागत कारक 2 ^ 10 राउंड (1024) है, 16 का लागत कारक 2 ^ 16 राउंड (65536) होगा। यह स्वाभाविक है कि 5-10 सेकंड लगेंगे। जब तक 10 का लागत कारक होता है, तब तक लगभग 64 बार लेना चाहिए। अन्य गलत सूचनाओं को दूर करने के लिए, PHP का क्रिप्ट फ़ंक्शन यूनिक्स क्रिप्ट लाइब्रेरी का उपयोग करता है जिसे c में लागू किया जाता है।
थोमसट्रेटर

3
@TJChambers यह सही है; यदि आप खाते पर पासवर्ड सेट कर सकते हैं, तो आप प्रमाणित कर सकेंगे। पासवर्ड हैशिंग का उद्देश्य उस हमले को रोकना नहीं है। इसका मतलब है कि किसी हमलावर को पासवर्ड तालिका के केवल पढ़ने के लिए प्रमाणित करने से रोकना। उदाहरण के लिए, आपको उस पर तालिका के साथ एक बैकअप टेप मिलता है।
इरिकसन

8
@ लॉबस्टरमैन नहीं, वास्तव में नहीं। यदि आप एक गुप्त रख सकते हैं, तो आप इस दृष्टिकोण का उपयोग नहीं करेंगे, आप केवल पासवर्ड स्टोर करेंगे। पासवर्ड प्रमाणीकरण योजनाएं इस धारणा पर आधारित हैं कि हमलावर ने वह सब कुछ खोज लिया है जो आप जानते हैं। नमक को प्रत्येक पासवर्ड को व्यक्तिगत रूप से हमला करने की आवश्यकता होती है। पासवर्ड के परीक्षण के लिए आवश्यक कम्प्यूटेशनल प्रयास पुनरावृत्तियों द्वारा नियंत्रित होते हैं। यदि उपयोगकर्ता अच्छे पासवर्ड चुनते हैं, तो नमक सुरक्षित होने पर भी वे सुरक्षित रहेंगे। नमक को छुपाना कुछ मामलों में खराब पासवर्ड से किसी की मदद कर सकता है, लेकिन मैं पहले पासवर्ड की गुणवत्ता पर काम करूंगा।
इरिकसन

1
@NLV यह एक स्ट्रिंग है जिसे bcrypt विनिर्देश में परिभाषित किया गया है:"OrpheanBeholderScryDoubt"
erickson

181

मेरा मानना ​​है कि वाक्यांश को निम्नानुसार शब्द होना चाहिए था:

bcrypt में इंद्रधनुषी टेबल हमलों को रोकने के लिए उत्पन्न हेस में निर्मित लवण हैं ।

bcryptउपयोगिता ही लवण की एक सूची बनाए रखने के लिए प्रतीत नहीं होता। बल्कि, लवणों को अनियमित रूप से उत्पन्न किया जाता है और फ़ंक्शन के आउटपुट में जोड़ा जाता है ताकि उन्हें बाद में याद रखा जाए ( जावा कार्यान्वयन केbcrypt अनुसार )। दूसरे शब्दों में, "हैश" द्वारा उत्पन्न bcryptनहीं है सिर्फ हैश। बल्कि, यह हैश और नमक है।


20
ठीक है, इसलिए मैं एक साइट के लिए साइन अप करता हूं और एक पासवर्ड चुनता हूं "फू"। Bcrypt"akd2! *" का एक यादृच्छिक नमक जोड़ता है, जिसके परिणामस्वरूप "fooakd2! *" होता है, जो हैशेड और संग्रहीत होता है। बाद में, मैं पासवर्ड "बार" के साथ साइन इन करने का प्रयास करता हूं। यह देखने के लिए कि क्या मैं सही हूँ, उसे "barakd2! *" हैश करने की आवश्यकता है। यदि नमक को बेतरतीब ढंग से शुरू करने के लिए उत्पन्न किया गया था, तो यह कैसे पता चलता है कि इसे हैशिंग और तुलना करने से पहले "बार" में वापस कैसे जोड़ा जाए?
नाथन लॉन्ग

46
@ नथन: bcryptपता है कि उत्पन्न आउटपुट से नमक वापस कैसे निकालना है (जो डेटाबेस में संग्रहीत है)। जब प्रमाणित करने का समय आता है, bcryptतो मूल आउटपुट को अपने हैश और नमक घटकों में अलग कर देता है। नमक घटक उपयोगकर्ता द्वारा टाइप किए गए आने वाले पासवर्ड पर लागू होता है।
एडम पेन्न्टर

22
नाथन लोंग की टिप्पणी का जवाब देने के लिए, यह सोचने का एक अच्छा तरीका यह है कि लवण का मतलब गुप्त नहीं है। यही कारण है कि नमक bcrypt फ़ंक्शन से आउटपुट में शामिल है, जैसा कि ऊपर दिए गए उत्तरों में से एक है। नमक वहाँ इंद्रधनुष तालिकाओं को रोकने के लिए है, जो आम पासवर्ड की सूची है, या बस क्रूर बल, आदि ... विभिन्न पासवर्डों की लेकिन हैशेड। नमक के बिना, डेटाबेस ए में एक पासवर्ड के लिए हैश डेटाबेस बी में पासवर्ड के लिए एक हैश के समान होगा। नमक केवल हैश मानों को बदल देता है जो किसी ऐसे व्यक्ति के लिए कठिन बना देता है जो डेटाबेस को डिक्रिप्ट (अनहैश) करने के लिए पासवर्ड चुराता है।
जोसेफ एस्ट्राहन

11
@ नथन लेकिन क्या कोई हमलावर केवल सभी पासवर्डों में ज्ञात लवण को हटा सकता है और फिर उनके साथ एक तालिका बना सकता है?
ऑस्कर

3
यह मैं इसे कैसे समझता हूं: विचार यह है कि प्रत्येक पासवर्ड में एक अद्वितीय नमक होता है। पासवर्ड हैश में शामिल नमक इसलिए हैकर को हर पासवर्ड के लिए एक इंद्रधनुष तालिका बनानी होगी। यह एक उदारवादी डेटाबेस के लिए भारी मात्रा में समय लेगा। यह सब एक हमलावर को धीमा करने के बारे में है और इस तरह जानवर को मजबूर कर रहा है।
PVermeer

0

चीजों को और अधिक स्पष्ट करने के लिए,

पंजीकरण / लॉगिन दिशा ->

पासवर्ड + नमक को एक कुंजी से उत्पन्न किया जाता है: लागत, नमक और पासवर्ड। हम उस एन्क्रिप्टेड वैल्यू को कॉल करते हैं cipher text। फिर हम नमक को इस मूल्य से जोड़ते हैं और इसे बेस 64 का उपयोग करके एन्कोडिंग करते हैं। इसके लिए लागत संलग्न करना और यह उत्पादित स्ट्रिंग है bcrypt:

$2a$COST$BASE64

यह मान अंततः संग्रहीत किया जाता है।

पासवर्ड खोजने के लिए हमलावर को क्या करना होगा? (अन्य दिशा <-)

यदि हमलावर को डीबी पर नियंत्रण मिला, तो हमलावर आसानी से बेस 64 मूल्य को डिकोड कर देगा, और फिर वह नमक देख सकेगा। नमक गुप्त नहीं है। हालांकि यह यादृच्छिक है। फिर उसे डिक्रिप्ट करने की आवश्यकता होगी cipher text

क्या अधिक महत्वपूर्ण है: इस प्रक्रिया में कोई हैशिंग नहीं है, बल्कि सीपीयू महंगा एन्क्रिप्शन - डिक्रिप्शन। इस प्रकार इंद्रधनुष की तालियाँ यहाँ कम प्रासंगिक हैं।


-2

यह वसंत सुरक्षा से PasswordEncoder इंटरफ़ेस प्रलेखन से है,

 * @param rawPassword the raw password to encode and match
 * @param encodedPassword the encoded password from storage to compare with
 * @return true if the raw password, after encoding, matches the encoded password from
 * storage
 */
boolean matches(CharSequence rawPassword, String encodedPassword);

जिसका अर्थ है, किसी को रॉसपासवर्ड से मिलान करना होगा जो उपयोगकर्ता अगले लॉगिन पर फिर से दर्ज करेगा और पिछले लॉगिन / पंजीकरण के दौरान डेटाबेस में स्टोर किए गए Bcrypt एन्कोडेड पासवर्ड से इसका मिलान करेगा।


यह सवाल का बिल्कुल भी जवाब नहीं देता है ... यह कुछ भी नहीं कहता है कि bcrypt में निर्मित लवण कैसे हो सकते हैं
spencer.sm
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.