代码之家  ›  专栏  ›  技术社区  ›  pc1oad1etter

为什么我的.net计算的MD5哈希值与网站上计算的哈希值不相等?

  •  5
  • pc1oad1etter  · 技术社区  · 17 年前

    我试图在JavaScript和.NET中生成等效的MD5哈希。网。由于也没有这样做,我决定使用第三方计算——这个 web site “密码”一词。稍后我会添加盐,但目前我无法使.net版本与网站的哈希值相匹配:

    5f4dcc3b5aa765d61d8327deb882cf99
    

    我猜这是一个编码问题,但我在中尝试了大约8种不同的MD5哈希计算方法。Net,它们都不符合我在JavaScript(或从网站)中获得的结果。这 MSDN example 是我尝试过的方法之一,它产生了我经常收到的哈希值:

    7c6a180b36896a0a8c02787eeafb0e4c
    

    Edit:遗憾的是,我意外地为两种不同的实现提供了不同的源字符串。EBSAK。*仍然有兴趣听听你对后续行动的答复。

    附加问题:哪种编码/格式最适合在数据库中存储哈希值?

    6 回复  |  直到 17 年前
        1
  •  9
  •   shoosh    17 年前

    从您引用的MSDN网站运行代码:

     // Hash an input string and return the hash as
        // a 32 character hexadecimal string.
        static string getMd5Hash(string input)
        {
                // Create a new instance of the MD5CryptoServiceProvider object.
                MD5 md5Hasher = MD5.Create();
    
                // Convert the input string to a byte array and compute the hash.
                byte[] data = md5Hasher.ComputeHash(Encoding.Default.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();
            }
    
    
            static void Main(string[] args)
            {
                System.Console.WriteLine(getMd5Hash("password"));
            }
    

    返回:

    5f4dcc3b5aa765d61d8327deb882cf99
    
        2
  •  4
  •   Tim Post Samir J M Araujo    14 年前

    发生这种情况是因为你正在进行哈希运算 password1 而不是 password ,或者可能正在计算 密码 不正确,它神秘地等于 密码1 .

    您可以对通过谷歌搜索提供的md5哈希值进行反向查找

    7c6a180b36896a0a8c02787eeafb0e4c
    
        3
  •  0
  •   Greg Hewgill    17 年前

    我得到的“密码”一词的值与该网站相同:

    $ echo -n password | md5
    5f4dcc3b5aa765d61d8327deb882cf99
    

    如果没有看到你实际使用的代码,就很难判断出哪里出了问题。

    至于在数据库中存储哈希值,我将它们存储为十六进制字符串。虽然大多数数据库都可以处理二进制blob,但将它们存储成二进制只节省了一半的空间,而且它们更难查询和操作。机会是 别的 不管怎样,与哈希一起存储的数据都更大。

        4
  •  0
  •   Mark Glorie    17 年前

    根据我自己的经验,这个VB.Net版本给出了与MySQL相同的结果:

    Private Function MD5Hash(ByVal str As String) As String
    
        Dim md5 As MD5 = MD5CryptoServiceProvider.Create
        Dim hashed As Byte() = md5.ComputeHash(Encoding.Default.GetBytes(str))
        Dim sb As New StringBuilder
    
        For i As Integer = 0 To hashed.Length - 1
            sb.AppendFormat("{0:x2}", hashed(i))
        Next
    
        Return sb.ToString
    
    End Function
    
        5
  •  0
  •   mattlant    17 年前

    你有任何代码来尝试做到这一点吗?

    (对第二个Q的响应)我通常使用字符串字段并将其存储为BASE64编码。易于使用和比较。

    /// <summary>
    /// Gets the Base 64 encoded SHA1 hashed password
    /// </summary>
    /// <returns>A Base 64 encoded string representing the SHA1 Hash of the password</returns>
    public string ToBase64SHA1String()
    {
        return Convert.ToBase64String(this.GetSHA1HashCode());
    
    }
    
        6
  •  0
  •   Adam    16 年前

    还应该注意的是,MD5和可以用彩虹表破解(互联网上有一些免费程序可以接受MD5和作为输入,并输出明文,通常是密码)

    SHA1可能是更好的选择。..

    编辑: 加盐是防止你的哈希值被颠倒的好方法
    编辑2: 如果我费心阅读你的帖子,我就会注意到你已经提到你打算加盐了