security बिल्ट्री में बिल्ट-इन लवण कैसे हो सकते हैं?




hash internals (2)

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

बीक्रिप्ट में इंद्रधनुष तालिका के हमलों को रोकने के लिए जेनरेटेड हैंश में निर्मित लवण होते हैं।

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

कोडा हैले का लेख "कैसे सुरक्षित रूप से एक पासवर्ड स्टोर करें" दावा करता है कि:

इंद्रधनुष तालिका हमलों को रोकने के लिए bcrypt में अंतर्निहित लवण है।

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

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

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

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

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

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


यह bcrypt है:

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

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

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

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

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

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

यह वास्तव में तीन फ़ील्ड है, जो "$" द्वारा सीमित है:

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

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





bcrypt