2009-09-22 21 views
20

पर जाकर मेरे पास एक लैंप (PHP) वेबसाइट है जो लोकप्रिय हो रही है।अनसाल्टेड से नमकीन एमडी 5 पासवर्ड

मैंने उपयोगकर्ता पासवर्ड को md5 हैश के रूप में संग्रहीत करके सुरक्षित किया।

लेकिन अब मैं देखता हूं कि यह सुरक्षित नहीं है; मुझे md5 हैश को नमकीन होना चाहिए था - क्योंकि वर्तमान में इंद्रधनुष सारणी का उपयोग करके अनसाल्टेड एमडी 5 हैश को डीकोड करना संभव है।

मैं क्या कर सकता हूं?

मैं हर किसी को नया पासवर्ड टाइप नहीं करना चाहता हूं।

+2

जब आप ' फिर से, यह MD5 ड्रॉप करने और SHA-2 पर जाने का एक अच्छा समय होगा। –

+2

इंद्रधनुष टेबल्स अनसाल्टेड हैश को डीकोड नहीं करते हैं, वे सिर्फ ज्ञात शब्दों/वाक्यांशों के लिए हैश की एक पूर्व संकलित सूची के खिलाफ तुलना करते हैं। – Powerlord

+0

बेमेरोस, यह निश्चित रूप से सच है, इस अर्थ में कि आप एक हैश को डीकोड नहीं कर सकते हैं। हालांकि, वे प्रभावी ढंग से यह निर्धारित करने की अनुमति देते हैं कि कौन से पासवर्ड हैश को संतुष्ट करेंगे, जो हैश से पासवर्ड प्राप्त करने के लिए है। अनुमोदित, यह किसी भी पासवर्ड के लिए काम नहीं करता है जो इंद्रधनुष तालिका में नहीं है, और फिर भी, यह हमेशा संभव है कि मैच संयोग है। –

उत्तर

-1

दुख की बात है, आपका एकमात्र तरीका है कि अपने उपयोगकर्ताओं को अपने पासवर्ड को नवीनीकृत करने के लिए कहें।

आप यादृच्छिक पासवर्ड भी उत्पन्न कर सकते हैं, लेकिन यह वही परेशानी है।

संपादित

आप कर सकते थे बस डबल एनकोड अपने संग्रहीत पासवर्ड। इसलिए अपने नए नमकीन हैशिंग एल्गोरिथ्म होगा:

md5(md5($new_password).$salt).':'.$salt 

अपने पुराने पासवर्ड

md5($old_password.$salt).':'.$salt 

का उपयोग करता है, तो एक प्रदान की पासवर्ड सही है की जाँच करने के लिए बस

list($stored_password, $salt) = explode(':', $salted_password); 
if(md5(md5($provided_password).$salt) == $stored_password) { 
    // you are now logged in 
} 
+0

हालांकि एमडी 5 के साथ खींचने से शायद आपको पूरी तरह से बेहतर सुरक्षा नहीं मिलती है। आप एमडी 5 हैश को सलाम करने का प्रयास करना चाहेंगे, और हैश उन स्ट्रिंग्स को अधिक जटिल हैश का उपयोग कर सकते हैं। – Martijn

0

दो विकल्प यहाँ

का उपयोग अद्यतन करने के लिए
  • पास डीकोड अपने आप को शब्द दें, और नमक के साथ उन्हें फिर से एन्कोड करें (मैं एमडी 5 की तुलना में थोड़ा अधिक फैंसी की सिफारिश करता हूं)। आपको उपयोगकर्ताओं को सूचित करना चाहिए कि आप अपने पासवर्ड अनएन्क्रिप्टेड देख रहे हैं। इसमें शायद बहुत समय लगेगा।
  • उन्हें अपने पासवर्ड दोबारा टाइप करें, और उन नमकीन और एन्क्रिप्टेड स्टोर करें।

जहाँ तक मैं देख सकता हूं, पासवर्ड पुनर्प्राप्त करने का कोई और तरीका नहीं है।

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

+0

md5 एक हैश है, इसे डीकोड नहीं किया जा सकता है। – Kobi

+0

आप सिर्फ "पासवर्ड स्वयं डीकोड नहीं कर सकते"। – Sam152

+1

वास्तव में, यदि आप नहीं कर पा रहे हैं, तो मूल समस्या मौजूद नहीं होगी। तथ्य यह है कि कोई भी इंद्रधनुष तालिकाओं का उपयोग कर सकते हैं। तो वैध सर्वर व्यवस्थापक भी कर सकते हैं। – MSalters

21

आप एक ही चरण में हैश बनाने के बजाय "2 कदम हैशिंग" कर सकते हैं।

आप उपयोगकर्ता नाम के लिए प्रत्येक पासवर्ड हैश जोड़ सकते हैं, और फिर इसे फिर से हैश करें। इससे अनूठी सूचनाओं के साथ नमकीन एक अपरिवर्तनीय हैश बन जाएगा।

रेह की सामान्य प्रक्रिया

नमक है + पीडब्ल्यूडी -> हैश

आप की तरह कुछ कर सकता है: पीडब्ल्यूडी -> हैश -> UserID + हैश -> हैश

(ध्यान दें उपयोगकर्ता आईडी केवल इसलिए चुना गया था ताकि प्रत्येक डबल हैश मौजूद हो ... अपने नमक को और अधिक जटिल बनाने के लिए स्वतंत्र महसूस करें)

+0

+1 - शायद मैंने जो सुझाव दिया उससे बेहतर है, बशर्ते उपयोगकर्ता नाम कभी नहीं बदले। –

+0

आपका मतलब है कि दो चरण हैशिंग। – Gumbo

+0

हां, टाइपो –

5

क्यों नहीं अपनी उपयोगकर्ता तालिका में एक नया कॉलम new_pwd जोड़ें, जोका परिणाम संग्रहीत करता है। इसके बाद आप new_pwd का प्रीकंपूट कर सकते हैं और new_pwd में md5(md5($entered_pwd) . $salt) के परिणाम की तुलना करने के लिए अपनी लॉगिन जांच को समायोजित करने के बाद। एक बार जब आप अपनी लॉगिन जांच को स्विच कर लेंगे, तो पुराने कॉलम को हटा दें।

जो इंद्रधनुष-टेबल शैली के हमलों को रोकना चाहिए।

+0

वर्तमान स्तंभ अभी भी पुराने पासवर्ड है - जिसका अर्थ है किसी डेटाबेस के लिए उपयोग लाभ, वे पासवर्ड नहीं है। –

+3

तो वर्तमान स्तंभ काम पूरा हो जाने को नष्ट! –

10

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

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

+0

+1 - इस विंडो एक समय के लिए इंद्रधनुष के तालिका हमलों के लिए खुला छोड़ देंगे, लेकिन आप भविष्य में इसे बंद करने के लिए, बहुत ज्यादा लॉग समय में प्रवेश प्रक्रिया उलझी बिना अनुमति देते हैं। –

+1

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

0

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

4

आप अभी भी नमक का उपयोग कर सकते हैं। बस एक साथ एक नमक के साथ वर्तमान हैश से एक और हैश की गणना:

$newHash = md5($salt.$oldHash); 

नए पासवर्ड के लिए आप तो उपयोग करने की आवश्यकता:

$hash = md5($salt.md5($password)); 
+1

यह वैसे है कि वे इसे VBulletin में कैसे करते हैं, btw ($ हैश = md5 ($ salt.md5 ($ पासवर्ड)); –

0

आप अपने टेबल स्टोर करने के लिए में एक स्तंभ जोड़कर पासवर्ड माइग्रेट कर सकते हैं नया प्रारूप

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

6

उत्तर सरल है, सुनिश्चित करें कि रिकॉर्ड रखने या किसी प्रकार का ध्वज रखने के लिए उपयोगकर्ताओं के पास हैशिंग की नई प्रणाली पर पासवर्ड हैं, जब वे अगली लॉगिन करते हैं, उन्हें प्रमाणीकृत करते हैं, नए हैश की गणना करते हैं, ध्वज फ़्लिप करते हैं।

अब जब भी कोई लॉग इन करता है और ध्वज सेट होता है, तो उन्हें नए हैश के साथ प्रमाणित करें।

+0

अच्छा विचार। स्वाभाविक रूप से, आप पुराने हैश मान को भी हटाना चाहते हैं। – Martijn

1

पासवर्ड को अपडेट करने के लिए पासवर्ड को अपडेट करने का एक शानदार तरीका पासवर्ड के लिए नमकीन SHA1 का उपयोग करना है। एक एसएचए 1 टकराव बनाने के लिए कठिन है, और इसमें एमडी 5 के लिए एक अलग स्ट्रिंग लंबाई भी है। एक एमडी 5 32 वर्ण लंबा है, जबकि एक एसएचए 1 40 वर्ण लंबा है।

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

अगर मुझे सही याद है, तो यह ठीक है कि वर्डप्रेस ने इस मुद्दे को कैसे संभाला।

0

दूसरों द्वारा उल्लिखित मूल हैश को नमक करें। यहां बस कुछ पॉइंटर्स:

  • नमक जितना अधिक बेहतर होते हैं। इसके अलावा यदि वे अधिक होते हैं तो केवल [ए-जेड -9] लेकिन लंबाई सबसे पहले बेहतर होती है।
  • यदि किसी के पास पहले से ही आपके डीबी की एक प्रति है और आप नमक के साथ एक ही पासवर्ड को दोहराते हैं, तो नमक के साथ पुराने हैश को फिर से काम नहीं करेगा। इसके बजाय आपको वास्तव में उपयोगकर्ताओं को एक नया पासवर्ड बनाने के लिए मजबूर होना चाहिए।
  • आपको सबसे अधिक इस्तेमाल किए गए पासवर्ड की विभिन्न सूचियों के खिलाफ नए पासवर्ड (और नमकीन होने के लिए पासवर्ड) से मेल खाना चाहिए। इन्हें "ब्रूट फोर्स" हमलों में उपयोग किया जाता है। उपयोगकर्ता को पासवर्ड बदलने के लिए संकेत/मजबूर करें।
0

आप MD5 से अलग हो रहे हैं, तो आप बस छोड़ नमक मिलाना और एक और भी बेहतर तकनीक खींच कहा जाता है के लिए जाना जाना चाहिए। विशेष रूप से आपको bcrypt का उपयोग करना चाहिए (php के साथ PHPASS के रूप में कार्यान्वित)।

यहाँ क्यों bcrypt पर एक बड़ा लिंक है: http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you-need-to-know-about-s.html

और यहाँ है एक छोटी कैसे: 1. डाउनलोड PHPass पैकेज: http://www.openwall.com/phpass/ 2. नीचे एक की तरह उदाहरण के लिए test.php पर देखो:

require 'PasswordHash.php'; 
$t_hasher = new PasswordHash(8, FALSE); 
$correct = 'plaintextpassword'; 
$hash = $t_hasher->HashPassword($correct); 
$check = $t_hasher->CheckPassword($correct, $hash); 

हैं $ जांच === सच हो (इस स्थिति से ऊपर है) तो पासवर्ड सही है। तो अपना पासवर्ड 'हैलो', आप इसे, HashPassword का उपयोग कर हैश एक डेटाबेस में हैश रखा, और जब कोई उपयोगकर्ता में लॉग करता है, फोन CheckPassword (userenteredpassword, hashInDb) देखने के लिए कि पासवर्ड सही है होता है

संबंधित मुद्दे