security मैं पासवर्ड के लिए अपने लॉगिन में नमक कैसे लागू करूं?




hash password-protection (7)

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

मुझे एसओ पर एक और पोस्ट भी मिली जहां एक और डेवलपर ने कहा:

"सुनिश्चित करें कि आपके नमक और एल्गोरिदम डेटाबेस से अलग से संग्रहीत हैं"

मैं डेटाबेस में नमक को स्टोर करना चाहता हूं। क्या यह वास्तव में एक समस्या है यदि मैं करता हूं?

मैं यह समझने में कुछ मदद ढूंढ रहा हूं कि यह कैसे काम करता है और यह भी कि सर्वोत्तम अभ्यास क्या हो सकता है। कोई भी मदद बहुत ही सराहनीय होगी।

संपादित करें: मैं अपने प्रतिक्रियाओं और विचारों के लिए सभी को धन्यवाद देना चाहता हूं। भले ही मैं अब और अधिक उलझन में हो सकता हूं, यह निश्चित रूप से मेरे लिए एक सीखने का अनुभव रहा है। फिर से धन्यवाद दोस्तों।


नमक का बिंदु हमलावरों को साइट पर एक ब्रूट फोर्स हमले की लागत को कम करने से रोकने के लिए है (या फिर भी बेहतर है, प्रत्येक उपयोगकर्ता के लिए अलग नमक का उपयोग करते समय: साइट के सभी उपयोगकर्ता) प्रीकंप्यूटेड इंद्रधनुष तालिकाओं के माध्यम से।

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

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

संपादित करें: मेरी ठोस सिफारिशें:

  • प्रत्येक उपयोगकर्ता के लिए लंबे छद्म यादृच्छिक नमक उत्पन्न करें और डीबी में स्टोर करें
  • एक bcrypt- आधारित हैश का प्रयोग करें
  • आदर्श रूप में, इसे स्वयं लागू न करें, इसके बजाय मौजूदा लाइब्रेरी का उपयोग करें

एक हैश फ़ंक्शन हमेशा एक ही इनपुट स्ट्रिंग के लिए समान मान देता है। मान लें कि मेरे उपयोगकर्ता (ऐलिस) में पासवर्ड secretmd5() का उपयोग कर secret हैशिंग निम्नलिखित हैश की ओर जाता है

5ebe2294ecd0e0f08eab7690d2a6ee69

एक शब्दकोश (सामान्य शब्दों और पासवर्ड की एक सूची) या उस सेवा की पेशकश करने वाली विभिन्न साइटों में से एक का उपयोग करके, हमलावर (मैलोरी) आसानी से पता लगा सकता है कि जब वह अपने शब्दकोश में 5ebe2294ecd0e0f08eab7690d2a6ee69 = secret में देखता है तो पासवर्ड गुप्त होता 5ebe2294ecd0e0f08eab7690d2a6ee69 = secret

हैशिंग से पहले नमक की प्रक्रिया आपके नमक को जानने के बिना एक शब्दकोश हमले का उपयोग करना मुश्किल बनाती है। निम्नलिखित को धयान मे रखते हुए:

<?php
$salt = '@!#%[email protected]#[email protected],[email protected]#@!';
$hash = md5($salt . 'secret');

परिणामी हैश अब b58ad809eece17322de5024d79299f8a लेकिन ऐलिस का पासवर्ड अभी भी secret । अब अगर मैलोरी को नमकीन हश पर हाथ मिल जाए तो संभावना है कि उसे अपने शब्दकोश में जवाब नहीं मिलेगा। अगर वह करती है, तो शब्दकोश उसे गलत जवाब देगा।

कभी भी अपने डेटाबेस में एक स्थिर नमक स्टोर न करें। पसंदीदा रूप से इसे अपने एप्लिकेशन की कॉन्फ़िगरेशन से स्टोर करें (जिस तरह से वेब से उपलब्ध नहीं होना चाहिए)।

यदि आप गतिशील नमक का उपयोग करने जा रहे हैं, तो आपको डेटाबेस का उपयोग करने की आवश्यकता होगी। अपने नमक को बनाने के लिए मौजूदा वैध डेटा के गैर-शून्य कॉलम का उपयोग करें (एक गुप्त एन्क्रिप्शन कुंजी के आधार पर उपयोगकर्ता नाम की ब्लाफिश-एन्क्रिप्टेड स्ट्रिंग आमतौर पर क्रिप्टोग्राफिक रूप से सुरक्षित होती है)। नमक के लिए एक अलग कॉलम का प्रयोग न करें। यदि आप मौजूदा कॉलम का उपयोग नहीं कर सकते हैं, तो अपने हैश की तुलना में उसी कॉलम में अपना नमक शामिल करें। उदाहरण के लिए, अपने 128-बिट नमक के लिए पहले 32 वर्णों का उपयोग करें और फिर अपने 160-बिट्स हैश के लिए अंतिम 40 का उपयोग करें। निम्न कार्य इस तरह के हैश उत्पन्न करेगा:

function seeded_sha1($string, $seed_bits) {
    if(($seed_bits % 8) != 0) {
        throw new Exception('bits must be divisible by 8');
    }

    $salt = '';
    for($i = 0; $i < $seed_bits; $i+=8) {
        $salt .= pack('c', mt_rand());
    }

    $hexsalt = unpack('h*hex', $salt);

    return $hexsalt['hex'] . sha1($salt . $string);
}

function compare_seeded_sha1($plain, $hash) {
    $sha1 = substr($hash, -40);
    $salt = pack('h*', substr($hash, 0, -40));

    $plain_hash = sha1($salt . $plain);
    return ($plain_hash == $sha1);
}

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

नोट: md5() पर अन्य प्रकार के हमले संभव हैं, यही कारण है कि आप उदाहरण के लिए अधिक सुरक्षित हैशिंग एल्गोरिदम, sha1() करते हैं। या, इससे भी बेहतर, पोर्टेबल PHP पासवर्ड हैशिंग फ्रेमवर्क का उपयोग करें, जिसे सुरक्षा में दिमाग में डिजाइन किया गया है और यह किसी भी PHP संस्करण के साथ पीछे संगत है।

require('PasswordHash.php');

$pwdHasher = new PasswordHash(8, FALSE);

// $hash is what you would store in your database
$hash = $pwdHasher->HashPassword( $password );

// $hash would be the $hashed stored in your database for this user
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
    echo 'password correct';
} else {
    echo 'wrong credentials';
}

तुलना के लिए आपको पासवर्ड नहीं मिला है। जब आप लॉगिन करने का प्रयास करते हैं और नए एन्क्रिप्टेड मान के साथ संग्रहीत मूल्य की तुलना करते हैं तो आप पासवर्ड एन्क्रिप्ट करते हैं।


जैसा कि आपने बताया है, हैशिंग एल्गोरिदम केवल एक तरफ काम करते हैं (या केवल तभी जब वे पर्याप्त मजबूत होते हैं: -D)

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

पासवर्ड को संग्रहीत करने का यह एक बहुत ही सुरक्षित तरीका है, भले ही डेटाबेस से समझौता किया गया हो, हैकर्स / क्रैकर्स को अभी भी अपनी स्थिर स्ट्रिंग हैश प्राप्त करने की आवश्यकता है और यह अनुमान लगाने की आवश्यकता है कि आपने सभी नमकीन कैसे लागू किया ..

उदाहरण के लिए मान लें कि आपके पास इन कॉलम के साथ users तालिका है:

id
username
password
created_at

एक बार भरने के बाद कॉलम आईडी और create_at कभी नहीं बदला जाना चाहिए ..

इसलिए जब आप उपयोगकर्ता के पासवर्ड को हिसिंग कर रहे हैं तो आप जितना सरल कर सकते हैं:

<?php
    $staticSalt = '[email protected];ap][';
    $userPass = 'my new pass';
    // assuming $user variable is already populated with DB data
    // we will generate new hash from columns and static salt:
    $genPass = sha1($user['id'] . $userPass . $user['created_at'] . $staticSalt);
?>

मुझे उम्मीद है कि यह मदद करता है :) चीयर्स


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

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

प्रति उपयोगकर्ता एक अद्वितीय नमक रखने और पासवर्ड हैश के साथ इसे संग्रहीत करने के उदाहरण के रूप में, मैं आपके विशिष्ट लिनक्स सिस्टम पर /etc/shadow को इंगित करूंगा।

[email protected]:/root# cat /etc/shadow | grep root
root:$1$oL5TTZxL$RhfGUZSbFwQN6jnX5D.Ck/:12139:0:99999:7:::

यहां, ओएल 5 टीटीजेक्सएल नमक है और RhfGUZSbFwQN6jnX5D.Ck/ हैश है। इस मामले में सादा-पाठ पासवर्ड रूट है, और हैश एल्गोरिदम मेरा सिस्टम उपयोग करता है एमडी 5-आधारित बीएसडी पासवर्ड एल्गोरिदम है। (मेरे पास नए सिस्टम बेहतर हैश एल्गोरिदम हैं)


हैशिंग पासवर्ड उन पासवर्ड को अपने स्वयं के व्यवस्थापक से गुप्त रखने के लिए है।

1) अपने डेटाबेस में सादे पाठ पासवर्ड रखना ठीक होगा, सिवाय इसके कि आपके पासवर्ड को किसी अन्य सिस्टम तक पहुंच प्राप्त करने के लिए व्यवस्थापक द्वारा उपयोग किया जा सकता है।

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

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

4) अंत में, आप एक वेग-सीमित हार्डवेयर हैशिंग समाधान का उपयोग कर अपने हैश फ़ंक्शन को एक गुप्त रख सकते हैं।

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

कुछ अन्य नोट्स:

ए) आप हमलावर के क्रूर बल हमले को धीमा करने के लिए पासवर्ड / नमक संयोजन पर bcrypt का उपयोग कर सकते हैं। लेकिन चूंकि हम प्रशासकों को मान रहे हैं, इसलिए वे धैर्यवान हो सकते हैं।

बी) पासवर्ड हैश से नमक को अलग रखना एक प्रभावी बचाव नहीं है, हम प्रशासकों को सब कुछ मानते हैं।

सी) नमक के रूप में मौजूदा डेटा का उपयोग थोड़ा बेहतर है, लेकिन मुझे संदेह है कि मौजूदा डेटा में एक यादृच्छिक नमक जितना एंट्रॉपी है।


किसी उपयोगकर्ता का पासवर्ड सहेजना संभवतः पासवर्ड को हैश करने से सुरक्षित है क्योंकि यह प्रीकंप्यूशन हमलों के खिलाफ सुरक्षा कर सकता है।

उदाहरण के लिए, यदि किसी हैकर को आपके डेटाबेस तक पहुंच मिलती है, और पासवर्ड नमकीन नहीं होते हैं, तो वह हैश के डेटाबेस में हैश देख सकता है ( http://en.wikipedia.org/wiki/Rainbow_table देखें) प्राप्त करने के लिए मूल पासवर्ड





salt