2009-09-04 11 views
14

मेरे पास एक पुराना एप्लिकेशन है जिसमें डेटाबेस में उपयोगकर्ता पासवर्ड को MD5 हैश के साथ संग्रहीत किया गया है। मैं इसे SHA-2 परिवार में कुछ के साथ बदलना चाहता हूं।मैं एमडी 5 से एसएचए में पासवर्ड हैशिंग कैसे बदलूं?

मैंने इसे पूरा करने के दो संभावित तरीकों के बारे में सोचा है, लेकिन दोनों बदसूरत लगते हैं।

1) एक बूलियन "ध्वज" फ़ील्ड जोड़ें। उपयोगकर्ता द्वारा पहली बार प्रमाणीकरण करने के बाद, एमडी 5 पासवर्ड हैश को SHA पासवर्ड हैश के साथ बदलें, और ध्वज सेट करें। फिर मैं यह देखने के लिए ध्वज की जांच कर सकता हूं कि पासवर्ड हैश बदल गया है या नहीं।

2) SHA हैश को स्टोर करने के लिए दूसरा पासवर्ड फ़ील्ड जोड़ें। उपयोगकर्ता द्वारा पहली बार प्रमाणीकरण करने के बाद, SHA के साथ पासवर्ड हैश और इसे नए फ़ील्ड में संग्रहीत करें (संभवतः एक ही समय में उनके MD5 हैश को हटाएं)। फिर मैं जांच सकता हूं कि एसएचए फ़ील्ड का मूल्य है या नहीं; यह अनिवार्य रूप से मेरा ध्वज बन जाता है।

किसी भी मामले में, एमडी 5 प्रमाणीकरण किसी भी उपयोगकर्ता के लिए कुछ समय के लिए जगह पर रहना होगा जो अक्सर लॉग इन करता है। और जो भी उपयोगकर्ता अब सक्रिय नहीं हैं उन्हें कभी भी SHA पर स्विच नहीं किया जाएगा।

क्या ऐसा करने का कोई बेहतर तरीका है?

+3

आपका दो समाधान मेरे लिए ठीक लग रहा है। – wtaniguchi

+0

और मैं नेड के जवाब को ऊपर उठा रहा हूं, उसके पास एक अच्छा बिंदु है। – wtaniguchi

+5

उन उपयोगकर्ताओं के लिए जो कभी भी स्विच नहीं किए जाते हैं - मुझे लगता है कि लोगों के एक निश्चित प्रतिशत के बाद स्विच किया गया है और एमडी 5 हैश से छुटकारा पाने के लिए पर्याप्त समय बीत चुका है। जिन लोगों ने उस अवधि के दौरान लॉग ऑन नहीं किया है, उन्हें अपने पासवर्ड रीसेट करना होगा जब वे कभी भी लॉग इन करेंगे। स्वीकार्य है या नहीं (और कब) एक व्यापार निर्णय है। –

उत्तर

11

अनिवार्य रूप से एक ही है, लेकिन शायद अतिरिक्त क्षेत्रों को जोड़ने की तुलना में अधिक सुंदर: Django में डिफ़ॉल्ट प्रमाणीकरण framwork में, पासवर्ड हैश इस तरह का निर्माण तारों के रूप में जमा हो जाती है:

hashtype$salt$hash 

Hashtype या तो SHA1 या md5 है, नमक एक यादृच्छिक स्ट्रिंग है जो कच्चे पासवर्ड को नमक करने के लिए प्रयोग किया जाता है और अंत में हैश स्वयं ही आता है।उदाहरण मान:

sha1$a1976$a36cc8cbf81742a8fb52e221aaeab48ed7f58ab4 
+0

यह सबसे अच्छा जवाब है। –

+0

इसका एकमात्र मुद्दा यह है कि यह नमक को इस तरह से स्टोर करता है जो उपयोगकर्ता के लिए एक और अद्वितीय या व्युत्पन्न मूल्य का उपयोग करने के बजाय स्पष्ट रूप से नमक बनाता है (जैसे कि उनके खाते के निर्माण के टाइमस्टैम्प का उत्परिवर्तित संस्करण, या बिट - उनके उपयोगकर्ता नाम, आदि फिसलने)। यह तर्कसंगत है कि क्या यह वर्तमान में व्यवहार्य अंतर बनाता है कि इसमें कितना समय लगेगा, मैं सिर्फ पागल हूं। – defines

+0

@ डस्टिन: यहां अतिरिक्त ताकत है जब उपयोगकर्ता अपना पासवर्ड बदलता है तो नमक बदला जा सकता है। – Joshua

3

मुझे लगता है कि आपको पहले से ही सर्वोत्तम संभावनाएं मिल चुकी हैं। मुझे # 2 से # 1 अधिक पसंद है, क्योंकि शा सेट होने के बाद एमडी 5 के लिए कोई उपयोग नहीं है।

एमडी 5 को रिवर्स करने का कोई तरीका नहीं है, इसलिए आपको उपयोगकर्ता को एक नया हैश बनाने के लिए फिर से प्रमाणित करने की प्रतीक्षा करनी है।

0

आपका दूसरा सुझाव मेरे लिए सबसे अच्छा लगता है। इस तरह लगातार उपयोगकर्ताओं को भविष्य में एक और अधिक सुरक्षित अनुभव होगा।

पहला प्रभावी ढंग से "क्विर्क-मोड" आपका कोडबेस है और केवल यह सुनिश्चित करता है कि नए उपयोगकर्ताओं के पास बेहतर SHA अनुभव हो।

+0

मेरे लिए ऐसा लगता है कि दो समाधान समान हैं, केवल थोड़ा अलग तरीके से लागू किए गए हैं। किसी भी तरह से, आपका पासवर्ड आपके अगले लॉगिन पर पुनः चलाया जाता है। –

+0

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

2

नहीं - मूल रूप से आपको एमडी 5 को तब तक रखना होगा जब तक कि आपके द्वारा देखी जाने वाली सभी उपयोगकर्ताओं को परिवर्तित नहीं किया जाता है। यह सिर्फ हैशिंग की प्रकृति है - आपके पास फिर से रूपांतरण करने के लिए पर्याप्त जानकारी नहीं है।

दूसरों के साथ रखने में एक और विकल्प पासवर्ड फ़ील्ड प्रभावी ढंग से आत्म-वर्णन करना होगा, उदा।

MD5:(md5 hash) 
SHA:(sha hash) 

फिर आप आसानी से जो एल्गोरिथ्म तुलना के लिए उपयोग करने के लिए पता लगाने के लिए, और दो क्षेत्रों होने से बचने के सकता है। फिर से, आप एसडीए के साथ एमडी 5 को ओवरराइट करेंगे जैसे आप साथ गए थे।

आप सभी मौजूदा पासवर्ड स्वयं को MD5 के रूप में घोषित करने के लिए प्रारंभिक अपडेट करना चाहते हैं।

+4

हैश का आकार इसे स्वयं वर्णन करता है: एमडी 5 हमेशा छोटा होता है। –

+2

लंबाई को एकमात्र संकेतक के रूप में उपयोग नहीं किया जाना चाहिए। आप इसे हश करने के लिए उसी हैश एल्गोरिदम का उपयोग करते समय हैश में क्या बदलना चाहते हैं (उदा। गणना, अन्य बीज डेटा)। एक अलग पहचानकर्ता होने से आपको संकेत मिलता है कि * आपकी * पासवर्ड हैशिंग योजनाओं का उपयोग किस प्रकार किया जा रहा है। – Rob

+1

यदि आपकी केवल दो विधियां लंबाई में भिन्न होती हैं तो आप निश्चित रूप से लंबाई के रूप में लंबाई का उपयोग कर सकते हैं। –

-1

यदि एमडी 5 को नमकीन नहीं किया जाता है तो आप पासवर्ड प्राप्त करने के लिए हमेशा एक डिक्रिप्शन साइट/इंद्रधनुष सारणी जैसे http://passcracking.com/index.php का उपयोग कर सकते हैं। यद्यपि पुनः-एन्कोड विधि का उपयोग करने के लिए शायद आसान है।

+5

यदि संभव हो तो यह बहुत नैतिक नहीं है, जब तक कि आप बहुत सावधानी बरतें, जब तक कि आप उन्हें क्रैक करते समय कोई भी पासवर्ड स्टोर न करें। –

+3

@ विंको - किसी कारण से यह अनैतिक महसूस करता है भले ही आप पासवर्ड को संग्रहित/लीक होने से रोकने के लिए सावधानी बरतें। –

6

आप उन्हें अपने DB में rehashing अगर आप पहली बार उन्हें MD5ing द्वारा अपने भविष्य के पासवर्ड बनाने के द्वारा SHA1 के लिए अपने सभी MD5 तार बदल सकते हैं। पासवर्ड की जांच करने के लिए उन्हें पहले MD5ing की आवश्यकता होती है, लेकिन मुझे नहीं लगता कि यह एक बड़ी हिट है।

php-कोड (प्रवेश):

पिछला: $ लॉगिन = (md5 ($ पासवर्ड) == $ storedMd5PasswordHash);

के बाद: $ लॉगिन = (sha1 (md5 ($ पासवर्ड)) == $ संग्रहीत Sha1PasswordHash);

नमक के साथ भी काम करता है, here से प्रारंभिक विचार मिला।

-4

हाँ आप वास्तविक पासवर्ड पता होना चाहिए पहले इससे पहले कि आप SHA-1 में तब्दील ..

आप md5 एन्क्रिप्टेड स्ट्रिंग से वास्तविक पासवर्ड प्राप्त करना चाहते हैं, तो आप कोशिश कर सकते हैं md5pass.com

+3

यह एक अच्छी तरह से डिजाइन प्रणाली में कभी भी संभव नहीं होना चाहिए। सभी पासवर्ड नमकीन संग्रहीत किया जाना चाहिए। –

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

  • कोई संबंधित समस्या नहीं^_^