security - आप अपने नमक तार कहां स्टोर करते हैं?




authentication hash (3)

अक्सर, वे हैश के लिए तैयार होते हैं और उसी क्षेत्र में संग्रहित होते हैं।

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

यदि आपके पास अधिक सुरक्षित संग्रहण स्थान था, तो वहां केवल हैश स्टोर करने का अर्थ होगा।

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

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

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

क्या इसके लिए कोई अनुशंसित समाधान है?


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

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


मैं इस पर थोड़ा अलग ले जाऊंगा।

मैं हमेशा नमक-पासवर्ड हैश के साथ मिश्रित नमक को स्टोर करता हूं।

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

इस दृष्टिकोण के लिए मेरा तर्क:

यदि पासवर्ड / हैश डेटा से समझौता किया गया है और हमलावर के हाथों में पड़ता है, तो हमलावर नहीं जानता कि नमक डेटा को देखने से क्या है। इस तरह एक हमलावर हश से मेल खाने वाले पासवर्ड को प्राप्त करने के लिए व्यावहारिक रूप से एक ब्रूट-फोर्स हमला नहीं कर सकता है, क्योंकि वह हैश को शुरू करने के बारे में नहीं जानता है और यह जानने का कोई तरीका नहीं है कि डेटा के कौन से हिस्से नमक के हिस्सों हैं, या नमकीन पासवर्ड हैश के हिस्सों ( जब तक वह आपके आवेदन के प्रमाणीकरण तर्क को नहीं जानता )।

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

हालांकि, उदाहरण के लिए, यहां तक ​​कि अगर नमकीन पासवर्ड हैश को संग्रहीत किया गया था, लेकिन एक यादृच्छिक बाइट के साथ पूर्व-पेंड किया गया है, तब तक हमलावर इस बात से अनजान है कि इस पहले बाइट को त्यागना है, इससे कठिनाई भी बढ़ेगी हमले का आपके उपयोगकर्ता को प्रमाणीकृत करने के लिए उपयोग किए जाने पर आपके एप्लिकेशन को डेटा के पहले बाइट को त्यागना होगा।

इस पर निष्कर्ष ..

1) डेटा को कभी भी स्टोर न करें कि आपका प्रमाणीकरण एप्लिकेशन इसके सटीक रूप में उपयोग करता है।

2) यदि संभव हो, तो अतिरिक्त सुरक्षा के लिए अपना प्रमाणीकरण तर्क गुप्त रखें।

एक कदम आगे जाओ ..

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

यादृच्छिक नमक पैदा करते समय, आप यादृच्छिक रूप से तय कर सकते हैं कि आपके नमक का अनुपात नमक-पासवर्ड हैश के पहले / बाद में स्टोर करेगा।

उदाहरण के लिए, आप 512 बाइट्स का यादृच्छिक नमक उत्पन्न करते हैं। आप नमक को अपने पासवर्ड में जोड़ते हैं, और अपने नमकीन पासवर्ड के SHA-512 हैश प्राप्त करते हैं। आप एक यादृच्छिक पूर्णांक 200 भी उत्पन्न करते हैं। फिर आप नमक के पहले 200 बाइट्स को स्टोर करते हैं, इसके बाद नमकीन पासवर्ड हैश, इसके बाद नमक के शेष भाग होते हैं।

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

इस दृष्टिकोण के पेशेवर:

बढ़ी हुई सुरक्षा - भले ही आपका प्रमाणीकरण तर्क ज्ञात हो, सटीक तर्क संकलन-समय पर अज्ञात है। सटीक तर्क के ज्ञान के साथ भी एक क्रूर बल हमले करने के लिए व्यावहारिक रूप से असंभव है। नमक की बढ़ी हुई लंबाई सुरक्षा को आगे बढ़ाएगी।

इस दृष्टिकोण का विपक्ष:

चूंकि सटीक तर्क को रन-टाइम पर अनुमानित किया जाता है, इसलिए यह दृष्टिकोण बहुत सीपीयू-केंद्रित है। नमक की लंबी अवधि, अधिक सीपीयू-गहन इस दृष्टिकोण बन जाता है।

गलत पासवर्ड प्रमाणीकरण में उच्चतम CPU लागत शामिल होगी। यह वैध अनुरोधों के प्रति प्रतिकूल हो सकता है, लेकिन हमलावरों के खिलाफ सुरक्षा बढ़ जाती है।

इस दृष्टिकोण को विभिन्न तरीकों से कार्यान्वित किया जा सकता है, और परिवर्तनीय-चौड़ाई नमक और / या नमकीन-पासवर्ड हैंश का उपयोग करके और भी सुरक्षित किया जा सकता है।





salt