2009-08-02 14 views
222

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

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

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

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

+7

यदि कोई ऐसा स्थान है जहां आप उस नमक को स्टोर कर सकते हैं जिसे हमलावर नहीं मिल सकता है, तो आपको बस पासवर्ड भी स्टोर करना चाहिए। लेकिन हर पासवर्ड के लिए एक अलग नमक का उपयोग क्यों नहीं करते? – jrockway

+6

वह हर पासवर्ड, जॉकवे के लिए एक अलग नमक का उपयोग कर रहा है। – Amber

+9

आपके लवण कितने बड़े हैं? आपके लवण पर्याप्त बड़े (32 बिट्स) होना चाहिए कि व्यावहारिक रूप से कोई मौका नहीं है कि इसके लिए इंद्रधनुष तालिका का प्रीकंप्यूटेड किया गया है। –

उत्तर

232

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

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

+15

सहमत हुए। नमक को अलग से रखकर आप जिस खतरा मॉडल की रक्षा कर रहे हैं वह एक ऐसा उपयोगकर्ता है जो किसी भी तरह से डीबी में नमक का उपयोग घृणित माध्यमों से कर सकता है, लेकिन हैश (डीबी में) नहीं। और वह व्यक्ति पहले से ही एक इंद्रधनुष तालिका की गणना शुरू कर देगा, मानते हुए कि वह बाद में हैश ढूंढ पाएगा। असंभव नहीं है, लेकिन इस एकल हमले एवेन्यू को aginst की रक्षा के लिए इंजीनियरिंग प्रयास के लायक भी नहीं है। –

+0

अच्छी पोस्ट, मैं वही बात सोच रहा था। मैंने कभी प्रति उपयोगकर्ता नमक के बारे में सोचा नहीं था, मैं सोच रहा था कि एक ही नमक सभी उपयोगकर्ताओं के लिए काम करेगा। ऐप सर्वर द्वारा लोड की गई XML फ़ाइल के रूप में संग्रहीत नमक के बारे में क्या? या शायद किसी भी तरह से servlet में hardcoded? – Jigzat

+8

@ जिगज़ैट - यदि आपके पास प्रत्येक उपयोगकर्ता के लिए अलग नमक नहीं है तो नमक व्यर्थ है। लवण का बिंदु हैश को प्रत्येक उपयोगकर्ता पासवर्ड के लिए एक अलग कार्य तोड़ना है; अगर नमक उन सभी के लिए समान है तो यह मामला नहीं है। – Amber

22

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

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

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

+3

लेकिन क्या होता है यदि सभी हैश किए गए पासवर्ड लीक किए गए नमक सहित लीक हो जाते हैं? क्या यह असुरक्षित नहीं है? – mghaoui

+8

@ मघौउ लेकिन फिर यदि आप "पासवर्ड" जानना चाहते थे तो आपको अभी भी प्रत्येक नमक के लिए इंद्रधनुष तालिका बनाना होगा, जब तक कि कुछ नमक समान न हों। – Franklin

32

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

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

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

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

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

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

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

निष्कर्ष यह करने के लिए ..

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

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

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

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

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

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

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

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

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

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

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

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

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

+5

आपके दृष्टिकोण के साथ आप बस अपनी हैशिंग प्रक्रिया में एक रहस्य जोड़ रहे हैं (एल्गोरिदम जो नमक लागू करता है)। यह रहस्य आप नमक के लिए ** मिर्च ** जोड़ने के साथ बहुत आसान जोड़ सकते हैं, मैंने इसे अपने [ट्यूटोरियल] (http://www.martinstoeckli.ch/hash/en/index.php) में इंगित करने का प्रयास किया। । बीसीआरपीटी जैसे आधुनिक हैश फ़ंक्शन प्रत्येक पुनरावृत्ति में मूल नमक का उपयोग करके स्वयं को नमक लागू करेंगे, इसलिए आप इस पर कोई नियंत्रण नहीं रखेंगे। – martinstoeckli

+0

@martinstoeckli जबकि आप सही हैं कि बीसीक्रिप्ट अपने आप पर नमक लागू करता है, उस नमक का भंडारण + हैश डेवलपर के रूप में आपके ऊपर है। तो, आप आसानी से नमक + हैश में एक काली मिर्च जोड़ सकते हैं और इसे डेटाबेस में बना सकते हैं। फिर, बाद में पुनर्प्राप्ति पर, आप डेटाबेस से मूल्य पढ़ते हैं, काली मिर्च मान को पट्टी करते हैं, और शेष मान को बीसीक्रिप्ट में पास करते हैं। – PeterToTheThird

+1

@ पीटर टॉथर्ड - यह काली मिर्च के लाभ को अस्वीकार कर देगा। काली मिर्च एक सर्वर की तरफ रहस्य जोड़ती है, और केवल तब तक काम करती है जब तक यह गुप्त रहता है (नमक के विपरीत)। एक सामान्य हमला एसक्यूएल-इंजेक्शन होता है, जब किसी को डेटाबेस तक पहुंच प्राप्त होती है लेकिन कोड के लिए नहीं, डेटाबेस में संग्रहीत एक काली मिर्च तब बेकार होगी। अधिकांश बीक्रीप्ट कार्यान्वयन नमक को परिणामी हैश-वैल्यू में स्वचालित रूप से जोड़ देंगे, इसलिए इस मान में पहले से ही नमक, लागत कारक, एल्गोरिदम और हैश शामिल है। यह स्ट्रिंग 60 अक्षरों की लंबाई के एक फ़ील्ड में संग्रहीत की जा सकती है। – martinstoeckli

3

विलियम Penberthy द्वारा ASP.NET MVC 4 वेब अनुप्रयोग पुस्तक का विकास के आधार पर:

  1. एक अलग डेटाबेस में संग्रहीत लवण के लिए उपयोग हो रही दो विभिन्न डेटाबेस को हैक करने की आवश्यकता है हैकर्स नमक तक पहुँच प्राप्त करने और नमकीन पासवर्ड। उन्हें में पासवर्ड के समान तालिका, या उसी डेटाबेस की एक और तालिका में संग्रहीत करना, का अर्थ है कि जब हैकर्स डेटाबेस तक पहुंच प्राप्त करते हैं, तो उन्हें नमक और पासवर्ड हैश दोनों तक पहुंच होगी। चूंकि सुरक्षा में हैकिंग को सिस्टम में बहुत महंगा या समय लेने वाली प्रणाली बनाने की प्रक्रिया शामिल है, इसलिए हैकर को प्राप्त करने के लिए की राशि को दोगुना करना होगा सिस्टम को और अधिक सुरक्षित बनाना चाहिए।
  2. उपयोग की आसानी हैश किए गए पासवर्ड के समान डेटाबेस में लवण रखने का प्राथमिक कारण है। आपको यह सुनिश्चित करना नहीं होगा कि एक ही समय में दो डेटाबेस हमेशा उपलब्ध हों, और हमेशा समन्वयित हों। नमक होने का लाभ न्यूनतम है यदि प्रत्येक उपयोगकर्ता में यादृच्छिक नमक होता है क्योंकि यद्यपि यह किसी व्यक्ति के पासवर्ड को आसान बना सकता है, तो सिस्टम के पासवर्ड को क्रैक करने के लिए आवश्यक बल की मात्रा अधिक होगी। चर्चा के इस स्तर में, वास्तव में उम्मीद है कि क्या है: पासवर्ड की सुरक्षा के लिए। यदि हैकर्स ने डेटाबेस की प्रति प्राप्त की है, तो आपके एप्लिकेशन डेटा पहले से ही समझौता किया गया है। इस बिंदु पर, साझा पासवर्ड की संभावनाओं के कारण उपयोगकर्ताओं के जोखिमों को कम करना है।
  3. दो अलग-अलग लिंक, डेटाबेस बनाए रखने की आवश्यकता व्यापक है। अनुमोदित, यह सुरक्षा की धारणा को जोड़ता है, लेकिन इसका एकमात्र लाभ यह है कि यह पासवर्ड, डेटा का एक तत्व है। यदि डेटाबेस में प्रत्येक फ़ील्ड व्यक्तिगत रूप से एन्क्रिप्टेड थे, और इसके लिए उसी नमक का उपयोग किया गया था, तो यह डेटा से अलग को स्टोर करने के लिए और अधिक समझदार होगा क्योंकि आपके सिस्टम की मूल सुरक्षा बढ़ी है।
संबंधित मुद्दे