security - नमक पीढ़ी और मुक्त स्रोत सॉफ्टवेयर




open-source encryption (4)

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

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

जैसा कि मैं इसे समझता हूं, लवण पैदा करने के लिए सबसे अच्छा अभ्यास अपने स्रोत कोड में संग्रहीत कुछ गुप्त सूत्र (या यहां तक ​​कि जादू निरंतर) का उपयोग करना है।

मैं एक परियोजना पर काम कर रहा हूं जिसे हम ओपन सोर्स के रूप में रिलीज करने की योजना बना रहे हैं, लेकिन समस्या यह है कि स्रोत के साथ नमक पैदा करने के लिए गुप्त सूत्र आता है, और इसलिए हमारी साइट पर इंद्रधनुष तालिका हमलों को चलाने की क्षमता है।

मुझे लगता है कि बहुत से लोगों ने मेरे सामने इस समस्या पर विचार किया है, और मैं सोच रहा हूं कि सबसे अच्छा अभ्यास क्या है। ऐसा लगता है कि अगर कोड खुला स्रोत है तो नमक होने का कोई मतलब नहीं है, क्योंकि नमक आसानी से विपरीत-इंजीनियर हो सकते हैं।

विचार?


एक डेस्कटॉप एप्लिकेशन के मामले में जो डेटा को एन्क्रिप्ट करता है और इसे रिमोट सर्वर पर भेजता है, तो आप हर बार एक अलग नमक का उपयोग करने पर विचार कैसे करते हैं?

उपयोगकर्ता के पासवर्ड के साथ पीकेसीएस # 5 का उपयोग करके, डेटा को एन्क्रिप्ट करने के लिए इसे एन्क्रिप्शन कुंजी उत्पन्न करने के लिए नमक की आवश्यकता होती है। मुझे पता है कि डेस्कटॉप एप्लिकेशन में नमक हार्डकोडेड (obfuscated) रखना एक अच्छा विचार नहीं है।

यदि रिमोट सर्वर को उपयोगकर्ता के पासवर्ड को कभी नहीं पता होना चाहिए, तो क्या हर बार उपयोगकर्ता को अलग नमक बनाना संभव है? यदि उपयोगकर्ता किसी अन्य कंप्यूटर पर डेस्कटॉप एप्लिकेशन का उपयोग करता है, तो वह रिमोट सर्वर पर डेटा को डिक्रिप्ट करने में सक्षम कैसे होगा यदि उसके पास कुंजी नहीं है (यह सॉफ़्टवेयर में हार्डकोड नहीं है)?


नमक उत्पन्न करने के लिए एक यादृच्छिक फ़ंक्शन जनरेटर का उपयोग करें, और इसे डेटाबेस में संग्रहीत करें, प्रति पंक्ति नमक बनाएं, और इसे डेटाबेस में संग्रहीत करें।

मुझे पसंद है कि django-पंजीकरण में नमक कैसे उत्पन्न होता है। संदर्भ: http://bitbucket.org/ubernostrum/django-registration/src/tip/registration/models.py#cl-85

salt = sha_constructor(str(random.random())).hexdigest()[:5]
activation_key = sha_constructor(salt+user.username).hexdigest()
return self.create(user=user,
           activation_key=activation_key)

वह एक यादृच्छिक संख्या और उपयोगकर्ता नाम हैश उत्पन्न करने के लिए उत्पन्न शा के संयोजन का उपयोग करता है।

Sha खुद को मजबूत और अटूट होने के लिए जाना जाता है। नमक उत्पन्न करने के लिए कई आयाम जोड़ें, यादृच्छिक संख्या, शा और उपयोगकर्ता विशिष्ट घटक के साथ, आपके पास अटूट सुरक्षा है!


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





rainbowtable