首页 文章

从字符串计算MD5哈希值

提问于
浏览
88

我使用以下C#代码从字符串计算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个字符的十六进制字符串是好的,但我认为客户输入代码是无聊的!

10 回答

  • 80

    我想在字符串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();
        }
    }
    
  • 121

    您可以使用 Convert.ToBase64String 将MD5的16字节输出转换为~24字符串 . 在不降低安全性的情况下更好一点 . ( j9JIbSY8HuT89/pwdC8jlw== 为您的例子)

  • 3

    完全取决于您想要实现的目标 . 从技术上讲,您可以从MD5哈希的结果中获取前12个字符,但MD5的规范是生成32个字符 .

    减小散列的大小会降低安全性,并增加冲突和系统崩溃的可能性 .

    也许如果你让我们更多地了解你想要实现的目标,我们可能会提供更多帮助 .

  • 6
    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
    // 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 are wanting
    
  • 4

    支持字符串和文件流 .

    例子

    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);
                }
            }
    
  • -1
    StringBuilder sb= new StringBuilder();
    for (int i = 0; i < tmpHash.Length; i++)
    {
       sb.Append(tmpHash[i].ToString("x2"));
    }
    
  • 6

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

    尝试使用LINQ创建MD5哈希的字符串表示,但是,没有一个答案是LINQ解决方案,因此将其添加到可用解决方案的大杂烩中 .

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

    MD5哈希是128位,因此您不能用十六进制表示少于32个字符...

相关问题