एक हैश मान के लिए नमक के मान को एक पासवर्ड की तरह जोड़ना, जिसे सादे पाठ में संग्रहीत नहीं किया जा सकता है, नमक मान प्राप्त करने के लिए सबसे अच्छी जगह कौन सी है? संदर्भ के लिए, मान लें कि यह वेबपेज लॉगिन पर पासवर्ड के लिए है।
एक हैश मान के लिए नमक के मान को एक पासवर्ड की तरह जोड़ना, जिसे सादे पाठ में संग्रहीत नहीं किया जा सकता है, नमक मान प्राप्त करने के लिए सबसे अच्छी जगह कौन सी है? संदर्भ के लिए, मान लें कि यह वेबपेज लॉगिन पर पासवर्ड के लिए है।
जवाबों:
मेरे पास आमतौर पर एक created TIMESTAMP
उपयोगकर्ता तालिका में एक कॉलम है , इसलिए मैं देख सकता हूं कि उपयोगकर्ता पंजीकृत कब है। मुझे नमक के लिए एक अतिरिक्त कॉलम जोड़ना पसंद नहीं है, इसलिए मैं टाइमस्टैम्प कॉलम को नमक के रूप में उपयोग करता हूं:
SHA1(password + created)
फर्क पड़ता है क्या?
नमक दो उद्देश्यों में कार्य करता है। यह पूर्व-निर्धारित पासवर्ड ("इंद्रधनुष तालिकाओं") की बड़ी तालिकाओं का उपयोग करने के लिए अव्यावहारिक बनाता है और यह समान पासवर्ड को हैश की सूची में अलग दिखता है। समान पासवर्ड बनाना अलग दिखने से एक समस्या से बचने में मदद मिलती है जहां कई लोग एक विशेष पासवर्ड का उपयोग कर रहे हैं, जो संभवतः एक सामान्य कमजोर है।
इसलिए, प्रत्येक खाते का अपना अनूठा नमक होना चाहिए, और लवणों को अधिक अनुमानित नहीं होना चाहिए, इस अर्थ में कि लवणों का एक समूह नहीं होगा जो होने की संभावना है। (यदि कई साइटें 1 से शुरू हुईं और गिना गईं, तो बुरे लोग उदाहरण के लिए, कम संख्या वाले लवणों सहित इंद्रधनुष तालिकाओं का निर्माण कर सकते हैं।) उन्हें किसी भी मायने में यादृच्छिक रूप से अप्रत्याशित होने की आवश्यकता नहीं है। वे हैश की तुलना में कोई अधिक गुप्त नहीं हैं, इसलिए उन्हें विशेष रूप से अनुचित होने की आवश्यकता नहीं है।
नमक उत्पन्न करने के लिए किसी भी सुविधाजनक विधि का उपयोग करें। यदि संभावित नमक के बहुत सारे मूल्य (प्रारंभिक यूनिक्स सिस्टम अक्सर 65536 की संभावित संख्या के लिए दो बाइट्स का उपयोग करते हैं), खातों की संख्या की तुलना में, अर्ध-यादृच्छिक असाइनमेंट लगभग कभी भी नकली नमक नहीं देगा।
हर बार जब आप एक नया पासवर्ड (पंजीकरण, पासवर्ड-रीसेट, पासवर्ड-अपडेट) स्टोर करना चाहते हैं, तो एक अच्छी तकनीक है:
for i in (0...65536) { password = hmac(password) }
ढांचे का लाभ उठाएं। .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
उपर्युक्त के अनुसार उपयोगकर्ता बनाम काम करता है। नमक प्रदान करने के लिए बेतरतीब ढंग से एक परिभाषित क्षेत्र में एक माउस ले जाना ट्रूक्रिप्ट द्वारा नियोजित एक विकल्प है। यह आपकी विशिष्ट आवश्यकताओं और सुरक्षा के स्तर को उबालता है; चूंकि आपका नमक बस हो सकता है !@#$%
।
आप एक नमक सर्वर-साइड उत्पन्न करते हैं और इसके निर्माण पर एक उपयोगकर्ता खाते में असाइन करते हैं। बेहतर अपने ढांचे के साथ उपलब्ध कुछ क्रिप्टो-पीढ़ी एपीआई का उपयोग करें लेकिन सिद्धांत रूप में कोई भी अनुक्रम करेगा।
आमतौर पर चीजें इस तरह जमा होती हैं:
User
-------------------
ID
Username
PasswordHashWithSalt
उदाहरण:
PasswordHashWithSalt =
A15CD9652D4F4A3FB61A2A422AEAFDD0DEA4E703 j5d58k4b56s8744q
Bcrypt का उपयोग करें और इस लेख को पढ़ें क्योंकि सामान्य हैश के लिए इस दिन और उम्र में गंभीर सुरक्षा नहीं है।
एसडीआर शून्य ज्ञान पासवर्ड प्रोटोकॉल का उपयोग करने पर विचार करें, जिसमें बहुत सारे ओपनसोर्स लाइब्रेरी हैं और पेटेंट मुक्त है।
एसडीआर को नमक की आवश्यकता होती है और ग्राहक पाने के लिए सबसे अच्छी जगह; समय उनके कीस्ट्रोक्स, माउस आंदोलनों, अपने पर्यावरण चर, यादृच्छिक संख्या, अपने अस्थायी फ़ोल्डर में फ़ाइल निर्माण समय, अपने सर्वर से दूर अप्रत्याशित तरीके से अपने अंत में नमक बनाने के लिए। एसडीआर नमक, एक बड़ा प्राइम, उपयोगकर्ता पासवर्ड लेता है और एक सत्यापन कुंजी बनाता है। आप एक पासवर्ड स्टोर नहीं करते हैं, यह उनकी मशीन को कभी नहीं छोड़ता है लेकिन आप यह सत्यापित कर सकते हैं कि उनके पास पासवर्ड है जो सत्यापनकर्ता कुंजी और नमक के साथ जाता है। यह मध्य और शब्दकोश के हमलों में आदमी से प्रतिरक्षा है। केवल सुनिश्चित करने के लिए डेटाबेस कॉलम में कुंजियों और नमक को एन्क्रिप्ट करें।