[C#] 문자열에서 MD5 해시 계산

다음 C # 코드를 사용하여 문자열에서 MD5 해시를 계산합니다. 그것은 잘 작동하고 다음과 같이 32 문자 16 진수 문자열을 생성합니다 :
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 자 16 진 문자열 (또는 12 자 문자열)을 생성하는 방법이 있습니까? 32 자 16 진 문자열은 좋지만 고객이 코드를 입력하는 것은 지루할 것입니다!



답변

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();
    }
}


답변

// 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


답변

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")
    );
}


답변

달성하려는 것에 전적으로 달려 있습니다. 기술적으로 MD5 해시의 결과에서 처음 12자를 사용할 수 있지만 MD5의 사양은 32자를 생성하는 것입니다.

해시 크기를 줄이면 보안이 떨어지고 충돌 및 시스템이 손상 될 가능성이 높아집니다.

어쩌면 당신이 달성하려는 것에 대해 더 많이 알려 주면 더 많은 도움을 줄 수있을 것입니다.


답변

Convert.ToBase64StringMD5의 16 바이트 출력을 ~ 24 자 문자열로 변환 하는 데 사용할 수 있습니다 . 보안을 줄이지 않고 조금 나아졌습니다. ( j9JIbSY8HuT89/pwdC8jlw==예를 들어)


답변

문자열 및 파일 스트림을 지원합니다.

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);
            }
        }


답변

문자열 MD5에서 UTF-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();
    }
}