একটি স্ট্রিং থেকে MD5 হ্যাশ গণনা করুন


131

আমি স্ট্রিং থেকে MD5 হ্যাশ গণনা করতে নীচের সি # কোড ব্যবহার করি। এটি ভালভাবে কাজ করে এবং এর মতো একটি 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
ক্লাস এমডি 5 আইডিপোজেবল কার্যকর করে, আপনার উদাহরণটি নিষ্পত্তি করতে ভুলবেন না। ;)
পাওলো ইওমমারিনী

5
সাধারণভাবে আপনার ইউটিএফ 8 এর মতো একটি নিখুঁত পাঠ্য এনকোডিং হ্যাশ করা উচিত।
অলিভার বক

5
@ প্রশান্তপিম্পল এমডি 5 হ'ল ডাইজেস্ট অ্যালগরিদম। এটিকে একটি গরুকে স্টিকে রূপান্তরিত হিসাবে ভাবেন।
অনন্ত দাবি

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
দুই বছরেরও বেশি পুরানো থ্রেডের জন্য প্রসঙ্গের বাইরে নিয়ে যাওয়া কিছু জন্য আমি নীচের ভোটের প্রশংসা করি। ;)
মাইকেল

"ইউনিক্স ফরম্যাটের অনুরূপ" কেন? আসলে কি একরকম নয়?
ইগর গ্যাটিস

এটি অনলাইন এমডি 5 চেকারদের থেকে আলাদা ফলাফল দেয়। অথবা এটা আমার ঠিক??
bh_earth0

@ bh_earth0 মনে হচ্ছে যে BitConverter: উইন্ডোজ এবং Linux একই ফ্যাশন কাজ করে না, এই প্রশ্নের দেখুন stackoverflow.com/questions/11454004/...
eddyP23

10

লিনকিউ ব্যবহার করে এমডি 5 হ্যাশের একটি স্ট্রিং প্রতিনিধিত্ব তৈরি করার চেষ্টা করা হয়েছিল, তবে, উত্তরগুলির কোনওটিরই লিনকিউ সমাধান ছিল না, সুতরাং এটি উপলব্ধ সমাধানগুলির স্মর্গাসর্ডে যুক্ত করা হয়েছে।

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") ) );
মার্ক ২৩৩77

... যে ক্ষেত্রে, আমি return string.Concat( hash.ComputeHash( Encoding.UTF8.GetBytes(observedText) ).Select( x => x.ToString("x2") ) );পরিবর্তে প্রস্তাব করছি । এটি সামান্য সংক্ষিপ্ত, সম্ভবত পরিষ্কার অভিপ্রায় এবং সামান্য দ্রুত সম্পাদন করে (<10% পারফেক্ট। বৃদ্ধি)।
২৩7777

9

আপনি কী অর্জন করতে চাইছেন তার উপর সম্পূর্ণ নির্ভর করে। প্রযুক্তিগতভাবে, আপনি কেবল এমডি 5 হ্যাশের ফলাফল থেকে প্রথম 12 টি অক্ষর নিতে পারেন, তবে এমডি 5 এর স্পেসিফিকেশনটি 32 চর এক তৈরি করা।

হ্যাশের আকার হ্রাস করা সুরক্ষা হ্রাস করে এবং সংঘর্ষের সম্ভাবনা বাড়ে এবং সিস্টেমটি নষ্ট হয়ে যায়।

আপনি যদি আমাদের কী অর্জন করার চেষ্টা করছেন সে সম্পর্কে যদি আপনি আমাদের আরও জানান তবে আমরা আরও সহায়তা করতে পারি।


+1 এটি উত্তর, কিন্তু আমিও সত্যই এর সুরক্ষা নিয়ে প্রশ্ন করি।
এলসি

আপনার উত্তরের জন্য ধন্যবাদ. এবং আমার খারাপ ব্যাখ্যা সম্পর্কে দুঃখিত। আমি উইন্ডোজের জন্য একটি অ্যাপ্লিকেশন প্রকাশ করতে চাই, ব্যবহারকারীর আমার অ্যাপ্লিকেশনটি ব্যবহারের জন্য লাইসেন্সটি কিনতে হবে, সুতরাং আমার অ্যাপ্লিকেশনটি দুটি ক্ষেত্রের জন্য অনুরোধ করেছে: USERNAME: ..., এবং KEY: .... আমি USERNAME হ্যাশ করতে চাই এবং কেইওয়াই তৈরি করতে চাই , তারপরে ব্যবহারকারীর নির্দিষ্ট USERNAME এবং KEY প্রবেশ করা উচিত। আমার সমস্যাটি হ'ল কেইটি 12-অক্ষর হওয়া উচিত, (তবে এমডি 5 হ্যাশগুলিতে আমি 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

আমি মনে করি স্ট্রিং MD5 এ ইউটিএফ -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

একটি এমডি 5 হ্যাশ 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);
    }
}

আপনি আরও নিশ্চিত করতে পারেন যে আপনার স্ট্রিংগুলি যথেষ্ট ছোট এবং এনকোডিং প্রতিস্থাপন করুন।


3

এই সমাধানের জন্য সি # 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

আমি এমন একটি বিকল্প প্রস্তাব দিতে চাই যা আমার পরীক্ষাগুলিতে (। নেট 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;

তবে এক লাইনে এমডি 5 হ্যাশ তৈরির জন্য এটি আমার।

string hash = BitConverter.ToString(MD5.Create().ComputeHash(Encoding.ASCII.GetBytes("THIS STRING TO MD5"))).Replace("-","");
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.