2010-01-23 13 views
5

मैंने यह प्रश्न देखा Encrypting/Hashing plain text passwords in databaseक्या .NET में हैश पासवर्ड के लिए कोई फ़ंक्शन फ़ंक्शन है?

और मुझे पता है कि मुझे md5 ("नमक" + पासवर्ड नहीं करना चाहिए; और मैं एक समाधान के लिए पायथन में एक कार्यान्वयन देखते हैं।

क्या कोई .NET पैराम के साथ फ़ंक्शन में बनाया गया है जिसका उपयोग मैं स्वयं लिखने के बजाय कर सकता हूं?

उत्तर

2

चेक बाहर FormsAuthentication.HashPasswordForStoringInConfigFile

string hashMD5 = FormsAuthentication.HashPasswordForStoringInConfigFile(Pass + Salt, "MD5"); 

string hashSHA1 = FormsAuthentication.HashPasswordForStoringInConfigFile(Pass + Salt, "SHA1"); 
+0

यह एपीआई अब अप्रचलित है। –

2

मैं वहाँ एक भी समारोह है नहीं लगता है, लेकिन आप कुछ लाइनों में यह कर सकते हैं (यहाँ SHA512 का उपयोग कर, लेकिन वहाँ अन्य विकल्प हैं):

using (var sha = new SHA512CryptoServiceProvider()) 
{ 
    byte[] hashed = sha.ComputeHash(Encoding.Default.GetBytes(saltedPassword)); 
    string output = Convert.ToBase64String(hashed); 
} 

सुनिश्चित करें कि आप क्रिप्टो से एक का उपयोग करें। .. कक्षाओं को अधिक सुरक्षित एल्गोरिदम का उपयोग करने के लिए सुनिश्चित किया जाता है।

+4

बहुत खराब योजना। नमक के बिना एक हैश इंद्रधनुष तालिका हमले के अधीन है। क्रिप्टो कक्षाओं का आपका उपयोग अच्छा था, लेकिन आपको यह जवाब उपयोगी बनाने के लिए नमक शामिल करना होगा। साथ ही, अंतिम पंक्ति को 'कन्वर्ट.ओबेस 6464' का उपयोग करना चाहिए, जो कि 'बिटकॉन्टर.ओस्ट्रिंग' जितना तेज़ है और बहुत कम स्ट्रिंग (इस मामले में 88 बाइट बनाम 1 9 2 बाइट) उत्पन्न करता है। यदि इन दो समस्याओं को सही किया गया है तो यह सबसे अच्छा जवाब हो सकता है, आईएमएचओ। –

+0

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

+0

कृपया किसी भी हैश फ़ंक्शन के एक ही पास का उपयोग न करें, इस पर ध्यान दिए बिना कि यह कितना अच्छा है। पासवर्ड हैशिंग - स्क्रिप्ट, बीसीआरपीटी, या पीबीकेडीएफ 2 (जैसे .NET के आरएफसी 28 9 8 डीरिवबाइट्स) पर अच्छा होने के लिए जाने वाली एक पद्धति का उपयोग करें। जबकि SHA-512 एक अच्छा क्रिप्टोग्राफ़िक हैश फ़ंक्शन है, यहां तक ​​कि 2014 के पुराने जीपीयू, [oclHashcat] (http://hashcat.net/oclhashcat/) पर 64-बिट ऑपरेशंस खराब होने के कारण भी एक गंभीर नुकसान पर 8x के साथ एक पीसी पर एएमडी आर 9 2 9 0 एक्सस्टॉक कोर घड़ी प्रति सेकंड 797 मिलियन अनुमान, या प्रति माह 2E15 अनुमानों का प्रयास कर सकती है। –

1

नहीं आप पासवर्ड हैशिंग के लिए MD5 उपयोग नहीं करना चाहिए !!!!!

खराब !!!!! न ही आप एक हैश पास (एमडी 5 या अन्य) पर नमक + पासवर्ड करना चाहिए !!! खराब!!!!

न ही आप नमक + पासवर्ड कई बार टुकड़ों में बांटा (XOR unles प्रति PBKDF2 के रूप में प्रत्येक हैश पास करना चाहिए !!! बुरा !!!! इस एपीआई

उपयोग: https://sourceforge.net/projects/pwdtknet अच्छा !!!!!

1

हां, .NET Framework 2.0 और ऊपर (अब तक 4.5 सहित) पीबीकेडीएफ 2 (जिसे आरएफसी 28 9 8 और पीकेसीएस # 5 वी 2 भी कहा जाता है) को Rfc2898DeriveBytes नामक कक्षा में लागू किया जाता है। तकनीकी रूप से, यह पीबीकेडीएफ 2-एचएमएसी-एसएचए -1 लागू करता है, जबकि पीबीकेडीएफ 2-एचएमएसी-एसएचए -512 जितना अच्छा है, पासवर्ड हैशिंग के लिए अभी भी उचित है।

पीबीकेडीएफ 2 तर्क:

  • एचएमएसी इस वर्ग के लिए कोई तर्क नहीं है - एचएमएसी-एसएचए -1 इस कार्यान्वयन में तय है, इसलिए आपको इसके बारे में चिंता करने की ज़रूरत नहीं है।
  • पासवर्ड उपयोगकर्ता का पासवर्ड है।
    • सादा पाठ, हेशिंग के बाद छोड़ दिया गया है।
  • नमक पर्याप्त लंबाई की एक क्रिप्टोग्राफिक रूप से यादृच्छिक प्रति-पंक्ति स्ट्रिंग है (उदाहरण के लिए, कम से कम 8 बाइट्स)। प्रत्येक पासवर्ड को अपने यादृच्छिक नमक की आवश्यकता होती है ताकि 300 उपयोगकर्ता अपने पासवर्ड के रूप में "पी @ $$ w0rd" चुन सकें, हैंश किए गए परिणाम सभी अलग हैं।
    • नमक डेटाबेस में सादे टेक्स्ट में संग्रहीत किया जाता है; अगली बार जब आप पासवर्ड हैश उत्पन्न कर रहे हैं तो यह देखने की ज़रूरत है कि परिणाम एक जैसा है या नहीं।
  • Iterations आप लूप पर जा रहे समय की संख्या है। किसी भी डेस्कटॉप या सर्वर हार्डवेयर के लिए, हजारों में शुरू करें और जब तक यह दर्द न हो जाए तब तक जाएं।
    • पुनरावृत्तियों की संख्या को डेटाबेस में सादे टेक्स्ट में भी संग्रहीत किया जाना चाहिए, ताकि बाद में इस नंबर को बदलने में मुश्किल हो (यानी इसे प्रोसेसिंग पावर बढ़ने के रूप में उच्च बना दें)।
  • .GetBytes आउटपुट लंबाई है, आपने अनुमान लगाया है, बाइट्स। इस मामले में, आपको 20 का उपयोग करना चाहिए।
    • कारण (उन्नत चर्चा): पासवर्ड हैशिंग के लिए, यह कभी भी देशी हैश आकार से अधिक नहीं होना चाहिए, क्योंकि किसी हमलावर को उससे अधिक उत्पन्न करने की आवश्यकता नहीं होगी (और देशी हैश आकार + 1 बाइट उत्पन्न करने से समय दोगुना हो जाता है, चूंकि यह उत्पादन की लंबाई में प्रत्येक मूल हैश आकार की मात्रा के लिए पुनरावृत्तियों का एक नया सेट शुरू करता है, परिणाम एक साथ जोड़ता है - हमलावर सुरक्षित रूप से यह मान सकता है कि यदि पहला आउटपुट मेल खाता है, तो यह सब मिल जाएगा, और यह 100% निश्चित है कि अगर पहला ब्लॉक विफल रहता है, यह एक मैच नहीं है)। चूंकि यह वर्ग SHA-1 तक सीमित है, इसलिए मूल हैश आकार 20 बाइट है। यदि आप किसी अन्य लाइब्रेरी का उपयोग करते हैं जिसमें विकल्प है, SHA-256 32 बाइट्स है, SHA-512 64 बाइट्स है।

ध्यान दें कि HMACSHA512 versus Rfc2898DeriveBytes for password hash कुछ नमूना नेट कोड है कि मैं विस्तार से विश्लेषण नहीं किया है शामिल है, लेकिन जो एक उपयोगी प्रारंभिक बिंदु हो सकता है।

+0

'फॉर्म्स प्रमाणीकरण। हैशपैसवर्डफोरस्टोरिंग कॉन्फ़िगरफाइलफ़ाइल' से बेहतर/खराब कैसे है इस पर कोई टिप्पणी? –

+1

आरएफसी 28 9 8 बहुत ही बेहतर है, यहां तक ​​कि एक मोरोनिक पुनरावृत्ति गिनती के साथ भी - हजारों बार में उचित पुनरावृत्ति गणना के साथ हजारों गुना बेहतर! वे माइक्रोसॉफ्ट के साथ शुरू करते हैं [नोट: यह एपीआई अब अप्रचलित है।] (Http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.hashpasswordforstoringinconfigfile (v = vs.110) .aspx) और जारी रखें "यह बस (लगभग निश्चित रूप से) अनसाल्टेड MD5 या SHA-1 है! ऐसा मत करो !!!" पर आधारित [Forms प्रमाणीकरण के लिए प्रतिस्थापन में ड्रॉप। हैशपैसवर्डफोरस्टोरिंग कॉन्फ़िगरफाइल?] (https://stackoverflow.com/q/13527277/1967612) –

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