एक स्ट्रिंग से एक MD5 हैश की गणना करें


131

मैं स्ट्रिंग से MD5 हैश की गणना करने के लिए निम्न C # कोड का उपयोग करता हूं। यह अच्छी तरह से काम करता है और इस तरह एक 32-वर्ण हेक्स स्ट्रिंग उत्पन्न करता है: 900150983cd24fb0d6963f7d28e17f72

string sSourceData;
byte[] tmpSource;
byte[] tmpHash;
sSourceData = "MySourceData";

//Create a byte array from source data.
tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);
tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);

// and then convert tmpHash to string...

क्या 16-वर्ण हेक्स स्ट्रिंग (या 12-वर्ण स्ट्रिंग) उत्पन्न करने के लिए इस तरह कोड का उपयोग करने का एक तरीका है? एक 32-वर्ण हेक्स स्ट्रिंग अच्छा है, लेकिन मुझे लगता है कि ग्राहक के लिए कोड दर्ज करना उबाऊ होगा!


7
आपको हेक्स में प्रवेश करने के लिए ग्राहक की आवश्यकता क्यों है?
दान दीनू

5
मुझे लगता है कि वह धारावाहिक कुंजी
थियागो

जवाबों:


197

MSDN के अनुसार

MD5 बनाएँ:

public static string CreateMD5(string input)
{
    // Use input string to calculate MD5 hash
    using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create())
    {
        byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
        byte[] hashBytes = md5.ComputeHash(inputBytes);

        // Convert the byte array to hexadecimal string
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < hashBytes.Length; i++)
        {
            sb.Append(hashBytes[i].ToString("X2"));
        }
        return sb.ToString();
    }
}


5
आपको हमेशा यह कहना चाहिए कि कहीं से कॉपी / पेस्ट करने पर आपको कोड मिलता है, अन्यथा इसे साहित्यिक चोरी के रूप में वर्गीकृत किया जाता है।
डेविड जीजे

1
वर्ग MD5 IDis प्रयोज्य लागू करता है, अपने उदाहरण को निपटाने के लिए याद रखें। ;)
पाओलो इओमारिनी

5
सामान्य तौर पर आपको UTF8 की तरह एक दोषरहित पाठ एन्कोडिंग होना चाहिए।
ओलिवर बॉक

5
@PrashantPimpale MD5 एक डाइजेस्ट एल्गोरिथम है। गाय को स्टेक में बदलने के बारे में सोचें।
अनंत दाधीच '’

95
// given, a password in a string
string password = @"1234abcd";

// byte array representation of that string
byte[] encodedPassword = new UTF8Encoding().GetBytes(password);

// need MD5 to calculate the hash
byte[] hash = ((HashAlgorithm) CryptoConfig.CreateFromName("MD5")).ComputeHash(encodedPassword);

// string representation (similar to UNIX format)
string encoded = BitConverter.ToString(hash)
   // without dashes
   .Replace("-", string.Empty)
   // make lowercase
   .ToLower();

// encoded contains the hash you want

13
मेरा जवाब सर्वश्रेष्ठ प्रथाओं को निरूपित करना नहीं था। यह इस संदर्भ में प्रदान किया गया था कि ओपी ने अपने प्रश्न को तैयार किया था। क्या ओपी को पूछा जाना चाहिए कि उपयोग करने के लिए सबसे उपयुक्त हैशिंग एल्गोरिथ्म क्या है, इसका उत्तर भिन्न (तदनुसार) होता।
माइकल

8
मैं एक धागे के लिए संदर्भ से बाहर की गई चीज के लिए डाउन वोट की सराहना करता हूं जो दो साल से अधिक पुरानी है। ;)
माइकल

क्यों "UNIX प्रारूप के समान"? क्या यह बिल्कुल समान नहीं है?
इगोर गैटिस ने

यह ऑनलाइन md5 चेकर्स से अलग परिणाम देता है। या यह सिर्फ मैं हूं??
bh_earth0

@ bh_earth0 ऐसा लगता है कि BitConverterखिड़कियों और लिनक्स पर एक ही फैशन में काम नहीं करता है, इस प्रश्न को देखें: stackoverflow.com/questions/11454004/…
eddyP23

10

LINQ का उपयोग करके MD5 हैश का एक स्ट्रिंग प्रतिनिधित्व बनाने की कोशिश कर रहा था, हालाँकि, कोई भी जवाब LINQ समाधान नहीं था, इसलिए इसे उपलब्ध समाधान के smorgasbord में जोड़ दिया गया।

string result;
using (MD5 hash = MD5.Create())
{
    result = String.Join
    (
        "",
        from ba in hash.ComputeHash
        (
            Encoding.UTF8.GetBytes(observedText)
        ) 
        select ba.ToString("x2")
    );
}

वन-लाइनर, विधि सिंटैक्स में:return string.Join( "", hash.ComputeHash( Encoding.UTF8.GetBytes(observedText) ).Select( x => x.ToString("x2") ) );
मार्क.2377 20

... किस मामले में, मैं return string.Concat( hash.ComputeHash( Encoding.UTF8.GetBytes(observedText) ).Select( x => x.ToString("x2") ) );इसके बजाय प्रस्ताव करता हूं । यह थोड़ा छोटा है, संभवतः स्पष्ट इरादा है, और थोड़ी तेजी से प्रदर्शन करता है (<10% perf। वृद्धि)।
मार्क.2377

9

पूरी तरह से इस पर निर्भर करता है कि आप क्या हासिल करने की कोशिश कर रहे हैं। तकनीकी रूप से, आप MD5 हैश के परिणाम से पहले 12 अक्षर ही ले सकते थे, लेकिन MD5 का विनिर्देश एक 32 char को जनरेट करना है।

हैश के आकार को कम करने से सुरक्षा कम हो जाती है, और टक्करों और सिस्टम के टूटने की संभावना बढ़ जाती है।

शायद अगर आप हमें इस बारे में अधिक जानकारी देते हैं कि आप क्या हासिल करने की कोशिश कर रहे हैं तो हम अधिक सहायता कर सकते हैं।


+1 यह जवाब है, लेकिन मैं भी, वास्तव में इसकी सुरक्षा पर सवाल उठाता हूं।
एलसी।

आपके उत्तर के लिए धन्यवाद। और मेरे बुरे स्पष्टीकरण के बारे में क्षमा करें। मैं विंडोज़ के लिए एक एप्लिकेशन प्रकाशित करना चाहता हूं, उपयोगकर्ता को मेरे आवेदन का उपयोग करने के लिए लाइसेंस खरीदना चाहिए, इसलिए मेरा आवेदन दो क्षेत्रों का अनुरोध करता है: USERNAME: ..., और KEY: .... मैं USERNAME को हैश करना चाहता हूं और प्रमुख बनाना चाहता हूं , तब उपयोगकर्ता को विशिष्ट USERNAME और KEY दर्ज करनी चाहिए। यहाँ मेरी समस्या यह है कि कुंजी 12-वर्ण की होनी चाहिए, (लेकिन MD5 हैश में, मुझे 32-वर्ण की कुंजी मिलती है)। कृपया मेरी मदद करो, मुझे वास्तव में इसकी आवश्यकता है।
मुहमद जाफ़रनजाद

8

आप Convert.ToBase64Stringएमडी 5 के 16 बाइट आउटपुट को ~ 24 चार स्ट्रिंग में बदलने के लिए उपयोग कर सकते हैं । सुरक्षा को कम किए बिना थोड़ा बेहतर। ( j9JIbSY8HuT89/pwdC8jlw==आपके उदाहरण के लिए)


2
एक अच्छा समाधान है, लेकिन मुझे संदेह है कि वह ओपी इसे केस-संवेदी और विशेष
आकर्षण के

5

समर्थन स्ट्रिंग और फ़ाइल स्ट्रीम।

उदाहरण

string hashString = EasyMD5.Hash("My String");

string hashFile = EasyMD5.Hash(System.IO.File.OpenRead("myFile.txt"));

-

   class EasyMD5
        {
            private static string GetMd5Hash(byte[] data)
            {
                StringBuilder sBuilder = new StringBuilder();
                for (int i = 0; i < data.Length; i++)
                    sBuilder.Append(data[i].ToString("x2"));
                return sBuilder.ToString();
            }

            private static bool VerifyMd5Hash(byte[] data, string hash)
            {
                return 0 == StringComparer.OrdinalIgnoreCase.Compare(GetMd5Hash(data), hash);
            }

            public static string Hash(string data)
            {
                using (var md5 = MD5.Create())
                    return GetMd5Hash(md5.ComputeHash(Encoding.UTF8.GetBytes(data)));
            }
            public static string Hash(FileStream data)
            {
                using (var md5 = MD5.Create())
                    return GetMd5Hash(md5.ComputeHash(data));
            }

            public static bool Verify(string data, string hash)
            {
                using (var md5 = MD5.Create())
                    return VerifyMd5Hash(md5.ComputeHash(Encoding.UTF8.GetBytes(data)), hash);
            }

            public static bool Verify(FileStream data, string hash)
            {
                using (var md5 = MD5.Create())
                    return VerifyMd5Hash(md5.ComputeHash(data), hash);
            }
        }

4

मुझे लगता है कि स्ट्रिंग एमडी 5 में यूटीएफ -8 एन्कोडिंग का उपयोग करना बेहतर है।

public static string MD5(this string s)
{
    using (var provider = System.Security.Cryptography.MD5.Create())
    {
        StringBuilder builder = new StringBuilder();                           

        foreach (byte b in provider.ComputeHash(Encoding.UTF8.GetBytes(s)))
            builder.Append(b.ToString("x2").ToLower());

        return builder.ToString();
    }
}

3

एक MD5 हैश 128 बिट है, इसलिए आप 32 से कम वर्णों वाले हेक्स में इसका प्रतिनिधित्व नहीं कर सकते ...


ठीक है, मुझे यहाँ कुछ याद आ रहा है। कैसे?
एलसी।

@ एलसी।, क्षमा करें, मेरे उत्तर में एक टाइपो था, मैंने "कैन" के बजाय "कैन" लिखा था ...
थॉमस लेवेस्क

3
System.Text.StringBuilder hash = new System.Text.StringBuilder();
        System.Security.Cryptography.MD5CryptoServiceProvider md5provider = new System.Security.Cryptography.MD5CryptoServiceProvider();
        byte[] bytes = md5provider.ComputeHash(new System.Text.UTF8Encoding().GetBytes(YourEntryString));

        for (int i = 0; i < bytes.Length; i++)
        {
            hash.Append(bytes[i].ToString("x2")); //lowerCase; X2 if uppercase desired
        }
        return hash.ToString();

3

.NET कोर 2.1 और उच्चतर के लिए मौजूदा उत्तर का तेज़ विकल्प:

public static string CreateMD5(string s)
{
    using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create())
    {
        var encoding = Encoding.ASCII;
        var data = encoding.GetBytes(s);

        Span<byte> hashBytes = stackalloc byte[16];
        md5.TryComputeHash(data, hashBytes, out int written);
        if(written != hashBytes.Length)
            throw new OverflowException();


        Span<char> stringBuffer = stackalloc char[32];
        for (int i = 0; i < hashBytes.Length; i++)
        {
            hashBytes[i].TryFormat(stringBuffer.Slice(2 * i), out _, "x2");
        }
        return new string(stringBuffer);
    }
}

आप इसे और अधिक अनुकूलित कर सकते हैं यदि आप सुनिश्चित हैं कि आपके तार काफी छोटे हैं और एन्कोडिंग को प्रतिस्थापित करते हैं। गेटबाइट्स को असुरक्षित int GetBytes (ReadOnlySpan वर्ण, स्पैन बाइट्स) विकल्प द्वारा।


3

इस समाधान के लिए c # 8 की आवश्यकता है और इसका लाभ उठाता है Span<T>। ध्यान दें, .Replace("-", string.Empty).ToLowerInvariant()यदि आवश्यक हो तो आपको परिणाम को प्रारूपित करने के लिए कॉल करना होगा।

public static string CreateMD5(ReadOnlySpan<char> input)
{
    var encoding = System.Text.Encoding.UTF8;
    var inputByteCount = encoding.GetByteCount(input);
    using var md5 = System.Security.Cryptography.MD5.Create();

    Span<byte> bytes = inputByteCount < 1024
        ? stackalloc byte[inputByteCount]
        : new byte[inputByteCount];
    Span<byte> destination = stackalloc byte[md5.HashSize / 8];

    encoding.GetBytes(input, bytes);

    // checking the result is not required because this only returns false if "(destination.Length < HashSizeValue/8)", which is never true in this case
    md5.TryComputeHash(bytes, destination, out int _bytesWritten);

    return BitConverter.ToString(destination.ToArray());
}


0

https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.md5?view=netframework-4.7.2

using System;
using System.Security.Cryptography;
using System.Text;

    static string GetMd5Hash(string input)
            {
                using (MD5 md5Hash = MD5.Create())
                {

                    // Convert the input string to a byte array and compute the hash.
                    byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));

                    // Create a new Stringbuilder to collect the bytes
                    // and create a string.
                    StringBuilder sBuilder = new StringBuilder();

                    // Loop through each byte of the hashed data 
                    // and format each one as a hexadecimal string.
                    for (int i = 0; i < data.Length; i++)
                    {
                        sBuilder.Append(data[i].ToString("x2"));
                    }

                    // Return the hexadecimal string.
                    return sBuilder.ToString();
                }
            }

            // Verify a hash against a string.
            static bool VerifyMd5Hash(string input, string hash)
            {
                // Hash the input.
                string hashOfInput = GetMd5Hash(input);

                // Create a StringComparer an compare the hashes.
                StringComparer comparer = StringComparer.OrdinalIgnoreCase;

                return 0 == comparer.Compare(hashOfInput, hash);

            }

0

मैं एक ऐसे विकल्प की पेशकश करना चाहता हूं जो मेरे परीक्षणों (.NET 4.7.2) में क्रैडिगैड्रेन के उत्तर की तुलना में कम से कम 10% तेज प्रदर्शन करता है :

public static string GetMD5Hash(string text)
{
    using ( var md5 = MD5.Create() )
    {
        byte[] computedHash = md5.ComputeHash( Encoding.UTF8.GetBytes(text) );
        return new System.Runtime.Remoting.Metadata.W3cXsd2001.SoapHexBinary(computedHash).ToString();
    }
}

यदि आप using System.Runtime.Remoting.Metadata.W3cXsd2001;शीर्ष पर रहना पसंद करते हैं , तो विधि बॉडी को वन-लाइनर पढ़ने में आसान बनाया जा सकता है:

using ( var md5 = MD5.Create() )
{
    return new SoapHexBinary( md5.ComputeHash( Encoding.UTF8.GetBytes(text) ) ).ToString();
}

स्पष्ट रूप से पर्याप्त है, लेकिन पूर्णता के लिए, ओपी के संदर्भ में इसका उपयोग किया जाएगा:

sSourceData = "MySourceData";
tmpHash = GetMD5Hash(sSourceData);

0

16 चरित्र हेक्स स्ट्रिंग्स के बारे में कुछ भी आइडैक ...।

using System;
using System.Security.Cryptography;
using System.Text;

लेकिन यहाँ एक लाइन में MD5 हैश बनाने के लिए मेरा है।

string hash = BitConverter.ToString(MD5.Create().ComputeHash(Encoding.ASCII.GetBytes("THIS STRING TO MD5"))).Replace("-","");
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.