security हैश के साथ नमक स्टोर करना ठीक है?




hash salt (6)

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

नमक का बिंदु पूरी तरह से यह सुनिश्चित करने के लिए है कि आप पूरे डेटाबेस या यहां तक ​​कि कई डेटाबेस में एक ब्रूट फोर्स हमले की लागत को कम नहीं कर सकते हैं।

पहला सॉफ़्टवेयर के हर नए संस्करण के साथ नमक को बदलना है, लेकिन यह अच्छा नहीं है क्योंकि सॉफ़्टवेयर के नए संस्करण पुराने पासवर्ड हैंश के खिलाफ परीक्षण करने में सक्षम नहीं होंगे।

मैंने जो देखा है उसकी एक भिन्नता स्थापना के दौरान एक यादृच्छिक नमक उत्पन्न करना है (और निश्चित रूप से इसे संस्करणों में रखें) ताकि प्रत्येक चलने वाले उदाहरण में एक अलग हो। बेशक, प्रत्येक पासवर्ड के लिए एक अलग नमक (शायद ऊपर के अलावा) बेहतर है।

मेरी समझ यह है कि नमक का उद्देश्य गुप्त होने का इरादा नहीं है, यह केवल किसी भी केंद्रीकृत मानक से अलग होना है ताकि आप इंद्रधनुष तालिका का उपयोग करने वाले सभी हैंश को तोड़ने के लिए इंद्रधनुष तालिका या इसी तरह के हमले को विकसित नहीं कर सकें, क्योंकि नमक टूट जाता है इंद्रधनुष तालिका। मेरी समझ यहां पूरी तरह से सही नहीं हो सकती है, इसलिए यदि मैं गलत हूं तो मुझे सही करें।

ओपन-सोर्स सॉफ़्टवेयर के व्यापक रूप से उपयोग किए जाने वाले टुकड़े में, नमक व्यापक रूप से जाना जाता है, और यह आपको हमलों तक खुलता है क्योंकि अब वे आपके हैश के नमकीन संस्करण पर हमला कर सकते हैं और इंद्रधनुष सारणी बना सकते हैं जिसमें नमक डेटा शामिल है।

जैसा कि मैंने इसे देखा, इस से निपटने के लिए दो विकल्प हैं। पहला सॉफ़्टवेयर के हर नए संस्करण के साथ नमक को बदलना है, लेकिन यह अच्छा नहीं है क्योंकि सॉफ़्टवेयर के नए संस्करण पुराने पासवर्ड हैंश के खिलाफ परीक्षण करने में सक्षम नहीं होंगे।

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

मेरा सवाल है, क्या यह स्वीकार्य है? नमक को सीधे पासवर्ड से सुरक्षित रखने के साथ जुड़े कोई अतिरिक्त जोखिम है? ऐसा लगता है कि स्रोत कोड में नमक भंडारण अलग नहीं है, इसलिए पासवर्ड के साथ नमक भंडारण करके कोई सुरक्षा हानि नहीं है।

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


परिभाषा के अनुसार salt प्रभावी होने के लिए यादृच्छिक होना चाहिए। इसके लिए किसी भी निर्धारिक मूल्य का उपयोग न करें। यह निश्चित रूप से तात्पर्य है कि आपको इसे हैश किए गए पासवर्ड के साथ डेटाबेस में स्टोर करने की आवश्यकता है। यूनिक्स सिस्टम परंपरागत रूप से पासवर्ड के समान क्षेत्र में हैश को स्टोर करते हैं (नमक पासवर्ड का एक निश्चित-लंबाई उपसर्ग है)। डेटाबेस में, आप उपयोगकर्ता तालिका में अतिरिक्त कॉलम प्राप्त कर सकते हैं।


आपका दूसरा समाधान "प्रति पासवर्ड संग्रहीत नमक है" सही है और आमतौर पर उपयोग किया जाता है।

"नमक" मुख्य रूप से यह पता लगाने में मुश्किल होता है कि दो उपयोगकर्ताओं के पास एक ही पासवर्ड होता है - इसलिए आप पासवर्ड में एक ज्ञात "नमक" मिश्रण करते हैं। नमक पासवर्ड चेक समय पर gettable होने की जरूरत है।

तो आम तौर पर या तो आप एक यादृच्छिक नमक उत्पन्न करते हैं और इसे पासवर्ड से स्टोर करते हैं या आप नमक के रूप में कुछ अन्य पहचानकर्ता (उपयोगकर्ता आईडी, उपयोगकर्ता नाम आदि) का उपयोग करते हैं।


अद्यतन : एक सक्षम लाइब्रेरी का उपयोग करें जैसे पायथन के लिए passlib

ये एक प्रति-पासवर्ड नमक उत्पन्न करने का ख्याल रखते हैं और वे एक उचित हैशिंग एल्गोरिदम का उपयोग करते हैं (यह केवल क्रिप्टोग्राफ़िक हैश जैसे SHA1 का उपयोग करने के लिए पर्याप्त नहीं है; आपको इसे इस तरह से लागू करना होगा जिससे इसे रिवर्स करने में बहुत धीमा हो जाए जैसे उदाहरण 1000 या इस पर अधिक बार इत्यादि। इस प्रकार पासवर्ड हैश काम करता है जैसे कि bcrypt काम। पासवर्ड संग्रहीत पुस्तकालय यह सब ठीक से करते हैं; वे आमतौर पर एक स्ट्रिंग उत्पन्न करते हैं जो bcrypt है ताकि वे हैश सिस्टम और कार्य कारक का उपयोग कर सकें; आप बस स्ट्रिंग को बिना स्टोर करते हैं इसे जानने की जरूरत है।

आप टेबल में 'सादे-पाठ' में नमक को स्टोर कर सकते हैं।

  • नमक को प्रभावी होने के लिए गुप्त होने की आवश्यकता नहीं है

  • यह सिर्फ यादृच्छिक होना चाहिए।

नमक एक ही या अन्य डेटाबेस में एक ही पासवर्ड के लिए हैश किए गए मूल्य को अतुलनीय बनाकर पासवर्ड को मजबूत करता है, और हैश लुकअप (जैसे 'इंद्रधनुष तालिकाओं') के लिए सामान्य पासवर्ड की बड़ी पूर्व-जेनरेट की गई सूचियों को अमान्य कर देता है।

तो यह महत्वपूर्ण है कि नमक प्रति उपयोगकर्ता अद्वितीय है और पासवर्ड के साथ कुछ यादृच्छिक मूल्य संग्रहीत है; प्रश्न में उल्लिखित विकल्प (पूरे आवेदन के लिए एक नमक मूल्य का उपयोग करके नमक के रूप में उपयोगकर्ता नाम का उपयोग करके) प्रत्येक विफल:

  • यदि सिस्टम उपयोगकर्ता नाम या अन्य ट्रिविया का उपयोग करते हैं, तो पासवर्ड अन्य उपयोगकर्ताओं में समान नाम वाले अन्य उपयोगकर्ताओं से तुलना की जा सकती है (कल्पना करें कि कितनी बार 'व्यवस्थापक' या 'रूट' उपयोगकर्ता खाता अलग-अलग सिस्टमों में एक ही पासवर्ड का उपयोग करता है .. ।)

  • यदि सिस्टम एक ही सिस्टम में सभी उपयोगकर्ताओं के लिए एक यादृच्छिक नमक का उपयोग करता है, तो दो उपयोगकर्ता जो एक ही पासवर्ड के पास एक ही पासवर्ड रखते हैं, वही हैश होगा, और एक उपयोगकर्ता का पासवर्ड अनुमान लगाकर दूसरे से समझौता करेगा।


आपके पास वास्तव में उपयोगकर्ता तालिका में संग्रहीत नमक मान है: तालिका की पाकी।

आपको नमक भंडारण के लिए एक नया स्तंभ आविष्कार करने की ज़रूरत नहीं है। बस पाकी का प्रयोग करें। निश्चित रूप से यह विचार मानता है कि आपके पास उपयोगकर्ता नाम से जुड़ी एक पाकी है। उदाहरण के लिए उपयोगकर्ता का नाम तालिका में पाकी नहीं है।

यह एक करीबी डीपी wtb है: पासवर्ड हैशिंग, नमक और धोया मूल्यों का भंडारण


डेटाबेस में सभी पासवर्ड के लिए एक ही नमक का उपयोग करना सहायक है, लेकिन प्रत्येक उपयोगकर्ता को एक अद्वितीय नमक देने से बहुत कम सुरक्षित है।

असल में: एक लंबा (बाइट्स में) पासवर्ड + नमक खोज स्थान को बढ़ाता है, और इस प्रकार "स्टॉक-मानक" इंद्रधनुष सारणी का उपयोग करना कठिन बनाता है।

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

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

इस कारण से, प्रति उपयोगकर्ता नमक जाने का सबसे अच्छा तरीका है। हालांकि, याद रखें कि आप पासवर्ड + नमक भी "लंबा" होना चाहते हैं।

यदि आप प्राथमिक कुंजी का उपयोग करना चाहते हैं, तो प्राथमिक कुंजी का उपयोग करने के बजाए प्राथमिक कुंजी के हैश को लेना शायद एक अच्छा विचार है, क्योंकि यदि उपयोगकर्ता 43 के लिए पासवर्ड + नमक "myPassword00000000043" जैसा दिखता है तो एक हमलावर एक निर्माण कर सकता है इस धारणा के साथ तालिका कि बीच में बहुत सारे शून्य हैं। क्रिएशन टाइमस्टैम्प और यादृच्छिक स्ट्रिंग शायद बेहतर विकल्प हैं, क्योंकि पीकेई को कभी-कभी आसानी से पाया जा सकता है या अनुमान लगाया जा सकता है।

नोट: मैं एक वास्तविक एन्क्रिप्शन विशेषज्ञ नहीं हूं, इस सलाह का उपयोग वास्तविक प्रणाली में नहीं करें।







salt