2012-10-19 17 views
18

स्ट्रिंग से MD5 हैश प्राप्त करने की आवश्यकता है।
त्रुटि प्राप्त करें MD5 शून्य है।
मैं स्ट्रिंग से 32 वर्ण MD5 हैश प्राप्त करने के लिए इच्छुक हूं।स्ट्रिंग से MD5 हैश

using (System.Security.Cryptography.MD5 md5 = 
     System.Security.Cryptography.MD5.Create("TextToHash")) 
{ 
    byte[] retVal = md5.Hash; 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < retVal.Length; i++) 
    { 
     sb.Append(retVal[i].ToString("x2")); 
    } 
} 

उत्तर

42

स्ट्रिंग से MD5 हैश प्राप्त करने की आवश्यकता है।

तो सबसे पहले आपको अपनी स्ट्रिंग को किसी रूप में बाइनरी डेटा में कनवर्ट करने की आवश्यकता है। आप कैसे करते हैं यह आपकी आवश्यकताओं पर निर्भर करेगा, लेकिन शायद यह कुछ एन्कोडिंग के लिए Encoding.GetBytes होगा ... आपको को एन्कोडिंग करने की आवश्यकता है। क्या इस हैश को कहीं और बनाया गया हैश से मिलान करने की ज़रूरत है, उदाहरण के लिए?

त्रुटि प्राप्त करें MD5 शून्य है।

ऐसा इसलिए है क्योंकि आप MD5.Create गलत तरीके से उपयोग कर रहे हैं। तर्क एल्गोरिदम नाम है। आपको लगभग निश्चित रूप से केवल parameterless overload का उपयोग करना चाहिए।

byte[] hash; 
using (MD5 md5 = MD5.Create()) 
{ 
    hash = md5.ComputeHash(Encoding.UTF8.GetBytes(text)); 
} 
// Now convert the binary hash into text if you must... 
+1

यदि यह एसक्यूएल वाचर (अधिकतम) से आया तो क्या यूटीएफ 8 सबसे अच्छा शर्त होगा? – Paparazzi

+0

पुन: पैरामीटर रहित अधिभार - क्या कोई जोखिम है कि डिफ़ॉल्ट एल्गोरिदम एक .NET संस्करण से अगले में बदल जाएगा? यदि ऐसा है तो एक संस्करण से अगले संस्करण तक एक ही स्ट्रिंग का हैश मेल नहीं करेगा? – xanadont

+2

@xanadont: नहीं। एमडी 5 एक मानकीकृत एल्गोरिदम है। परिणाम बदलना मूल रूप से एक बग होगा। –

19

स्ट्रिंग Create के लिए पारित "hash के लिए पाठ" नहीं है, लेकिन एल्गोरिथ्म का उपयोग करें:

मैं आप की तरह कुछ चाहते हैं संदेह है। मुझे लगता है आप चाहते हैं:

using (System.Security.Cryptography.MD5 md5 = 
    System.Security.Cryptography.MD5.Create()) 
{ 
    byte[] retVal = md5.ComputeHash(Encoding.Unicode.GetBytes("TextToHash")); 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < retVal.Length; i++) 
    { 
     sb.Append(retVal[i].ToString("x2")); 
    } 
} 
+1

हाय रीड: मेरे पास एक प्रश्न है: मुझे कैसे पता चलेगा कि कौन से एन्कोडिंग का उपयोग करना है? मेरे मामले में, मुझे एक हैश को कैल्क करना होगा जिसे मुझे क्वेरी स्ट्रिंग के रूप में प्राप्त हुआ था। (इसलिए जब यह http पोस्ट किया गया था, तो शायद यह यूटीएफ -8 था), फिर भी, एक बार यह .NET स्ट्रिंग में संग्रहीत होने के बाद, क्या यह अब यूनिकोड (यूटीएफ -16) में होगा, क्योंकि यह देशी एन्कोडिंग है? क्या वह परिवर्तन मेरे लिए हुआ? – JMarsch

+0

@JMarsch हाँ - यदि आप एन्कोडिंग का उपयोग करते हैं तो यह "बस काम करेगा"। यूनिकोड, अगर यह मूल रूप से यूटीएफ -8 था। –

+0

ध्यान रखें कि यदि आपकी "स्रोत" MD5 की गणना आपकी स्ट्रिंग की utf-8 प्रस्तुति पर की गई थी, तो आप अब एक अलग MD5 प्राप्त करेंगे यदि आप इसके बजाय utf-16 का उपयोग करते हैं। यह सच है भले ही आपके पास अपनी स्ट्रिंग के भीतर केवल ASCII वर्ण हों। – brighty

1

कारण आप एक null वापसी हो रही है Create विधि के लिए string पैरामीटर है एल्गोरिथ्म, नहीं पाठ किया जाता है कि टुकड़ों में बांटा जा रहा है speciies। कोई टेक्स्टटॉश एल्गोरिदम नहीं है इसलिए आपको वापसी के रूप में null मिलते हैं।

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