पंजीकरण में नमक जोड़ना
तो, आप पहले से ही जानते हैं कि
md5 के माध्यम से हैशिंग एक अपरिवर्तनीय प्रक्रिया है और एक हैकर,
जिसे हैश तक पहुंच मिल जाती है, वह इस हैश से
पासवर्ड प्राप्त नहीं कर सकता है।
वास्तव में यह कथन पूरी तरह से सही नहीं है - वर्तमान में दुर्भावनापूर्ण हैकरों ने लोकप्रिय और कम लोकप्रिय पासवर्डों के हैशों की लाइब्रेरी बना ली है और कोई भी मूर्ख बस उसके हैश को गूगल करके पासवर्ड का पता लगा सकता है।
यह काफी सरल, लोकप्रिय पासवर्डों के बारे में है।
उदाहरण के लिए, हैश 827ccb0eea8a706c4c34a16891f84e7b
को गूगल में खोजें
और आप तुरंत गूगल खोज में देखेंगे कि यह
पासवर्ड '12345' है।
काफी जटिल पासवर्डों के हैश इस तरह से नहीं खोजे जा सकते (आज़माएं)।
आप पूछ सकते हैं कि समस्या क्या है - चलो हम सभी जटिल पासवर्डों के साथ पंजीकरण करेंगे। हालाँकि, एक समस्या है - अधिकांश उपयोगकर्ता अपने डेटा की सुरक्षा के बारे में नहीं सोचते हैं और काफी सरल पासवर्ड दर्ज कर सकते हैं।
हम पंजीकरण के दौरान उपयोगकर्ताओं को
अधिक लंबे पासवर्ड बनाने के लिए मजबूर कर सकते हैं, उदाहरण के लिए,
न्यूनतम वर्णों की संख्या को 6
या 8 तक सीमित करके, हालाँकि, फिर भी
'123456' या '12345678' जैसे पासवर्ड बनेंगे।
बेशक, पासवर्ड की जटिलता की जांच के लिए एक अधिक चतुर एल्गोरिदम बनाया जा सकता है, लेकिन एक और समाधान है।
इस समाधान का सार यह है: पासवर्ड को नमकीन करना होगा। नमक - यह एक विशेष यादृच्छिक स्ट्रिंग है, जो पंजीकरण के दौरान पासवर्ड में जोड़ी जाएगी और हैश की गणना अब साधारण पासवर्ड से नहीं, बल्कि नमक+पासवर्ड वाली स्ट्रिंग से की जाएगी, यानी कि नमकीन पासवर्ड से।
यानी पंजीकरण के दौरान आप कुछ इस तरह करेंगे:
<?php
$salt = '1sJg3hfdf'; // नमक - एक जटिल यादृच्छिक स्ट्रिंग
$password = md5($salt . $_POST['password']); // पासवर्ड को नमकीन हैश में बदलें
?>
इस स्थिति में नमक प्रत्येक उपयोगकर्ता के लिए अलग होगा, इसे यादृच्छिक रूप से उत्पन्न करने की आवश्यकता होगी पंजीकरण के समय।
यहाँ एक तैयार फ़ंक्शन है, जो यह करेगा:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // नमक की लंबाई
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // ASCII-table से वर्ण
}
return $salt;
}
?>
इस फ़ंक्शन की सहायता से हम अपना कोड इस तरह फिर से लिख सकते हैं:
<?php
$salt = generateSalt(); // नमक
$password = md5($salt . $_POST['password']); // नमकीन पासवर्ड
?>
मैं एक बार फिर दोहराता हूं, कि ये परिवर्तन पंजीकरण के दौरान थे - डेटाबेस में केवल पासवर्ड का हैश नहीं, बल्कि नमकीन पासवर्ड का हैश सहेजते हैं।
यह अभी सब कुछ नहीं है: उपयोगकर्ताओं वाली तालिका में
login और password फ़ील्ड के अलावा
एक और फ़ील्ड salt बनाने की आवश्यकता है, जिसमें
हम प्रत्येक उपयोगकर्ता का नमक संग्रहीत करेंगे।
ऊपर वर्णित नमकीन पासवर्ड के साथ पंजीकरण लागू करें।