नमक हैश मान कहाँ से आना चाहिए?


12

एक हैश मान के लिए नमक के मान को एक पासवर्ड की तरह जोड़ना, जिसे सादे पाठ में संग्रहीत नहीं किया जा सकता है, नमक मान प्राप्त करने के लिए सबसे अच्छी जगह कौन सी है? संदर्भ के लिए, मान लें कि यह वेबपेज लॉगिन पर पासवर्ड के लिए है।


@DevArt, मुझे लगा कि यह यहाँ बेहतर अनुकूल है क्योंकि इसके लिए बहुत व्यक्तिपरक उत्तर की आवश्यकता है। एक नमक मूल्य कहीं से भी खींचा जा सकता है, इसलिए मैं पूछ रहा हूं "आपको क्या लगता है कि ग्राहक या सर्वर से नमक मूल्यों को खींचने के लिए सबसे सुरक्षित स्थान कहां है?"
मॉर्गन हेरलॉकर

जवाबों:


7

मेरे पास आमतौर पर एक created TIMESTAMPउपयोगकर्ता तालिका में एक कॉलम है , इसलिए मैं देख सकता हूं कि उपयोगकर्ता पंजीकृत कब है। मुझे नमक के लिए एक अतिरिक्त कॉलम जोड़ना पसंद नहीं है, इसलिए मैं टाइमस्टैम्प कॉलम को नमक के रूप में उपयोग करता हूं:

SHA1(password + created)

मैं तब मान रहा हूं कि जब उपयोगकर्ता फिर से साइन इन करता है, तो आप सत्यापन के लिए फिर से शुरू करने पर उपयोगकर्ता नाम के आधार पर तारीख खींचते हैं?
मॉर्गन हेरलॉकर

1
@Prof: हाँ, उसी तरह जैसे आप करते हैं अगर आपके पास नमक के लिए एक विशिष्ट कॉलम है, तो उस परिप्रेक्ष्य में कोई अंतर नहीं है।
जोनास

7

फर्क पड़ता है क्या?

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

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

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


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

1
@ जस्टिन: दिलचस्प, मैंने कभी भी हैश के भाग के रूप में उपयोग किए जाने वाले उपयोगकर्ता नाम को नहीं देखा था, लेकिन यह वास्तव में कुछ भयावह जोड़ने का एक अच्छा तरीका है। मैं अभी भी एक छद्म यादृच्छिक नमक का उपयोग करता हूँ, सिर्फ इसलिए कि यह एक को उत्पन्न करने के लिए ज्यादा खर्च नहीं करता है।
मैथ्यू एम।

2
@ मैथ्यू के साथ इसे कहीं स्टोर करने के नकारात्मक पहलू के साथ, और अगर लेन-देन के दोनों पक्षों को इसकी आवश्यकता है, तो इसे भी भेजना होगा। उपयोगकर्ता नाम के साथ, दोनों पक्ष इसे पहले से ही जानते हैं।
मैथ्यू फ्रेडरिक

2
@ जस्टिन: जिस स्थिति में आप नमक के रूप में उपयोगकर्ता नाम का उपयोग कर रहे हैं। यह नमक के दोनों उद्देश्यों का जवाब देता है: इंद्रधनुष के टेबल को अव्यवहारिक बनाना, और समान पासवर्ड बनाना अलग दिखता है।
डेविड थॉर्नले

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

3

हर बार जब आप एक नया पासवर्ड (पंजीकरण, पासवर्ड-रीसेट, पासवर्ड-अपडेट) स्टोर करना चाहते हैं, तो एक अच्छी तकनीक है:

  • नया नमक उत्पन्न करें
    • क्रिप्टोग्राफिक रूप से सुरक्षित छद्म यादृच्छिक संख्या जनरेटर का उपयोग करें
    • एक सभ्य आकार के नमक का उपयोग करें - एक अच्छा मूल्य अंतर्निहित हैश एल्गोरिथ्म का ब्लॉक आकार है (SHA-256 हो सकता है)
  • एक नया पासवर्ड टोकन जनरेट करें
    • अंतर्निहित हैश एल्गोरिथ्म (शायद SHA-256 हो सकता है) से hmac कुंजी के रूप में नमक का उपयोग करके एक hmac फ़ंक्शन बनाएं
    • for i in (0...65536) { password = hmac(password) }
    • एचएमएसी फ़ंक्शन के पुनरावृत्त अनुप्रयोगों का परिणाम पासवर्ड टोकन है
  • नमक और पासवर्ड टोकन स्टोर करें
    • मूल पासवर्ड को स्टोर न करें
    • वैकल्पिक रूप से अंतर्निहित हैश एल्गोरिथ्म और खोज के लिए स्ट्रेच को संग्रहीत करें

1

ढांचे का लाभ उठाएं। .NET में आप RNGCryptoServoiceProvider का उपयोग कर सकते हैं ...

        // If salt is not specified, generate it on the fly.
        if (saltBytes == null)
        {
            // Define min and max salt sizes.
            int minSaltSize = 4;
            int maxSaltSize = 8;

            // Generate a random number for the size of the salt.
            Random  random = new Random();
            int saltSize = random.Next(minSaltSize, maxSaltSize);

            // Allocate a byte array, which will hold the salt.
            saltBytes = new byte[saltSize];

            // Initialize a random number generator.
            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();

            // Fill the salt with cryptographically strong byte values.
            rng.GetNonZeroBytes(saltBytes); 
        }

अन्य रूपरेखाओं में समान कक्षाएं होनी चाहिए, जिनका आप लाभ उठा सकते हैं। यादृच्छिकता सॉफ्टवेयर प्राप्त करने के लिए अक्सर Randomउपर्युक्त के अनुसार उपयोगकर्ता बनाम काम करता है। नमक प्रदान करने के लिए बेतरतीब ढंग से एक परिभाषित क्षेत्र में एक माउस ले जाना ट्रूक्रिप्ट द्वारा नियोजित एक विकल्प है। यह आपकी विशिष्ट आवश्यकताओं और सुरक्षा के स्तर को उबालता है; चूंकि आपका नमक बस हो सकता है !@#$%


1

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

आमतौर पर चीजें इस तरह जमा होती हैं:

User
-------------------
ID
Username
PasswordHashWithSalt

उदाहरण:

PasswordHashWithSalt =

A15CD9652D4F4A3FB61A2A422AEAFDD0DEA4E703 j5d58k4b56s8744q


हालांकि यह क्या है के आधार पर निरुपित? क्या यह कुछ मूल्य से नहीं आता है जो कि जगह पर रहेगा ताकि उपयोगकर्ता द्वारा निर्माण के बाद वापस आने पर इसे दोहराया जा सके?
मॉर्गन हेरलॉकर

"असाइन" के साथ मेरा मतलब है कि प्रति उपयोगकर्ता नाम / पासवर्ड जोड़ी (खाता) में एक नमक उत्पन्न करें और इसे डेटाबेस में संग्रहीत करें। जब आपको लॉगिन करने की आवश्यकता होती है, तो आप चीजों को जांचने के लिए उस संग्रहीत नमक का उपयोग करते हैं।

1

Bcrypt का उपयोग करें और इस लेख को पढ़ें क्योंकि सामान्य हैश के लिए इस दिन और उम्र में गंभीर सुरक्षा नहीं है।

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

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

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