आप अपने नमक के तार कहां जमा करते हैं?


250

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

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

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

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


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

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

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

@emddudley इन दिनों मैं नमक के रूप में 64-बिट पूर्णांक का उपयोग करने की आदत में रहा हूं, लेकिन कोई कारण नहीं है कि मैं उन्हें लंबे समय तक नहीं कर सकता।
4

10
PWDTK के लेखक यहाँ sourceforge.net/projects/pwdtknet , ईमानदारी से मुझे चिंता नहीं होगी और मैं बस एक ही DB में पासवर्ड के रूप में नमक स्टोर करूंगा। आपको हमेशा यह मान लेना चाहिए कि नमक वैसे भी एक हमलावर के लिए जाना जाता है, इसलिए आपका ध्यान एक लार्ज CRYPTO- रैंडम नमक का उपयोग करने और पर्याप्त महत्वपूर्ण स्ट्रेचिंग (PBKDF2 में पुनरावृत्ति) करने पर होना चाहिए ताकि एक ज्ञात नमक के लिए एक इंद्रधनुष तालिका बनाना भी संभव हो। ईमानदारी से जो आप कहीं और नमक डालकर हासिल करने की कोशिश कर रहे हैं वह है "सुरक्षा द्वारा अस्पष्टता" और आम तौर पर कोई लाभ नहीं होता है जब आप संभावित रूप से नीचे जाने के लिए किसी अन्य सर्वर जैसी चीजों को देखते हैं।
थशीज़नेट्स

जवाबों:


259

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

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


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

अच्छी पोस्ट, मैं एक ही बात सोच रहा था। मैंने प्रति उपयोगकर्ता एक नमक के बारे में कभी नहीं सोचा था मैं सोच रहा था कि एक एकल नमक सभी उपयोगकर्ताओं के लिए काम करेगा। एक एक्सएमएल फ़ाइल के रूप में संग्रहीत नमक के बारे में क्या है जो ऐप सर्वर द्वारा लोड किया गया है? या हो सकता है किसी तरह एक सर्वलेट में हार्डकोड किया गया हो?
जिगज़ात २५'१२ को २:५

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

3
@TomRitter एकमात्र मामला नहीं है। आप मानते हैं कि सभी पासवर्ड जटिल हैं। कुछ हमलावर नमक और हैश ले सकते हैं और केवल 10,000 सबसे आम पासवर्ड की जांच कर सकते हैं। इस तरह उन्हें लोगों की एक अच्छी संख्या मिलेगी। यदि, हालांकि, उनके पास नमक तक पहुंच नहीं है, तो यह उपयोगकर्ता के लिए अधिक सुरक्षित पासवर्ड है। अब, यह कैसे संभव है कि नमक डेटाबेस सुरक्षित रहेगा जबकि पासवर्ड डेटाबेस चोरी होने पर बहस के लिए तैयार है, लेकिन यह एक अलग मुद्दा है।
chacham15

@ पर, मेरा मानना ​​है कि टॉमरिटर सही है। नमक को अलग से रखने का मतलब है कि एक हमलावर बल का उपयोग करने के लिए मजबूर करने के बीच अंतर एक आसान शब्दकोश हमले बनाम एक क्रूर बल हमला। यदि आप नमक जानते हैं, तो आप इसे केवल मिल डिक्शनरी के हमले के दौरान जोड़ सकते हैं। यदि आप अपने नमक का 100% बचाव कर सकते हैं, तो आप बस एक ही नमक का उपयोग कर सकते हैं और हमलावरों को बलपूर्वक सब कुछ (यहां तक ​​कि उन उपयोगकर्ताओं के लिए भी जो अपने पासवर्ड के रूप में "पासवर्ड" का उपयोग करते हैं) का उपयोग कर सकते हैं। लेकिन क्या आप अपने नमक का बचाव कर सकते हैं .... शायद नहीं। इसलिए यह हैश के बगल में स्टोर करके विफलता के बिंदुओं को कम कर सकता है और मजबूत पासवर्ड नियमों को लागू कर सकता है।
21

35

मैं इस पर कुछ अलग ले जाऊंगा।

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

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

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

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

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

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

इस के लिए निष्कर्ष ..

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

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

एक कदम और आगे बढ़ो ।।

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

रैंडम सॉल्ट जेनरेट करते समय, आप बेतरतीब ढंग से यह भी तय कर सकते हैं कि नमकीन-पासवर्ड हैश से पहले और बाद में आप अपने नमक का क्या अनुपात रखेंगे।

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

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

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

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

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

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

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

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


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

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

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

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

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

23

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

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

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


4
लेकिन क्या होता है यदि सभी हैशेड पासवर्ड उनके मेलिंग नमक सहित लीक हो जाते हैं? क्या यह असुरक्षित नहीं है?
मघौउई

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

4

विलियम पेन्बरी द्वारा ASP.NET MVC 4 वेब एप्लिकेशन बुक के विकास पर आधारित:

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

यदि एप्लिकेशन दोनों डेटाबेसों को प्रमाणित कर सकता है, तो क्या यह अनिवार्य रूप से वैसा ही नहीं है जैसे कि वह एक डेटाबेस था, अगर हमलावर ने एप्लिकेशन कोड से समझौता किया है?
जॉन अर्नेस्ट

0

एक नमक का बिंदु सभी इंद्रधनुष तालिकाओं को बेकार करने के लिए है और उन्हें बनाने के लिए नए सेट की आवश्यकता होती है। इंद्रधनुष की तालिका बनाने के लिए एक स्ट्रिंग का अनुमान लगाने में बस उतना ही समय लगता है। उदाहरण के लिए "पासवर्ड" का SHA-256 हैश है 5e88 4898 da28 0471 51d0 e56f 8dc6 2927 7360 3d0d 6aab bdd6 2a11 ef72 1d15 42d8। नमक जोड़ने के बाद, जैसे "बैडगॉर्ड" के रूप में हैशेड होने के लिए नया स्ट्रिंग "पासवर्डबैडबॉर्डवर्ड" है, जो कि हिमस्खलन प्रभाव के कारण नाटकीय रूप से आउटपुट को बदल देता है, को 457b f8b5 37f1 802e f9c8 2e46 b8d3 f8b5 721b 7cbb d485 f0bb e523 bfbe 73e6 58d6

आम तौर पर नमक सिर्फ पासवर्ड के रूप में उसी डेटाबेस में संग्रहीत किया जाता है, क्योंकि अगर एक डेटाबेस को हैक किया जाता है, तो यह संभावना है कि दूसरा भी होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.