为什么不是';my.net计算的MD5哈希值是否与网站上计算的哈希值相等?

为什么不是';my.net计算的MD5哈希值是否与网站上计算的哈希值相等?,.net,security,hash,cryptography,.net,Security,Hash,Cryptography,我试图在JavaScript和.Net中生成等效的MD5哈希。也没有这样做,我决定使用第三方计算-这是一个字“密码”。稍后我将添加salts,但目前无法使.net版本与网站的哈希匹配: 5f4dcc3b5aa765d61d8327deb882cf99 我猜这是一个编码问题,但我在.Net中尝试了大约8种不同的方法来计算MD5哈希,但没有一种方法与我在JavaScript(或网站)中获得的方法相匹配。这是我尝试过的方法之一,它产生了我通常收到的哈希: 7c6a180b36896a0a8c0278

我试图在JavaScript和.Net中生成等效的MD5哈希。也没有这样做,我决定使用第三方计算-这是一个字“密码”。稍后我将添加salts,但目前无法使.net版本与网站的哈希匹配:

5f4dcc3b5aa765d61d8327deb882cf99
我猜这是一个编码问题,但我在.Net中尝试了大约8种不同的方法来计算MD5哈希,但没有一种方法与我在JavaScript(或网站)中获得的方法相匹配。这是我尝试过的方法之一,它产生了我通常收到的哈希:

7c6a180b36896a0a8c02787eeafb0e4c
编辑:遗憾的是,我无意中为两个不同的实现提供了不同的源字符串。EBSAK.:-/仍然有兴趣听到您对后续问题的回答


附加问题:在数据库中存储哈希值的最佳编码/格式是什么?

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

如果看不到您实际使用的代码,就很难判断出哪里出了问题


至于在数据库中存储哈希,我将它们存储为十六进制字符串。尽管大多数数据库可以处理二进制blob,但将它们存储为二进制只会节省一半的空间,而且它们更难查询和操作。很可能您存储的其他数据以及散列都会更大。

根据我自己的经验,此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

你有任何代码,你是如何尝试这样做的

(对第二个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());

}
//
///获取基本64编码的SHA1哈希密码
/// 
///表示密码SHA1散列的Base 64编码字符串
公共字符串ToBase64SHA1String()
{
返回Convert.ToBase64String(this.GetSHA1HashCode());
}

从您引用的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"));
        }

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

SHA1可能是一个更好的选择

编辑:添加盐是防止哈希被逆转的好方法

编辑2:如果我费心阅读你的帖子,我会注意到你已经提到你计划添加salt

这是因为你正在散列
password1
,而不是
password
,或者可能错误地计算了
密码
,不知何故它神秘地等于
密码1

您可以对谷歌提供的md5哈希进行反向查找

7c6a180b36896a0a8c02787eeafb0e4c

您使用javascript哈希的目的是什么?我问这个问题的原因是,如果出于安全考虑,它应该只在服务器上生成。退一步说,我觉得(作为对类似主题的回答)最好地解释了为什么不应该使用类似MD5的东西进行密码哈希。建议阅读。正确::/我在两个实现中使用了不同的源字符串。白痴!我已经链接到我正在使用的一种方法——在帖子中,或者使用Base64,它只将二进制文件扩展三分之一而不是加倍。并不是说MD5可以安全地用于密码哈希。我认为即使使用salt,MD5也不够安全。@Ramhound在你发表评论5年后,它肯定不安全=)
5f4dcc3b5aa765d61d8327deb882cf99
7c6a180b36896a0a8c02787eeafb0e4c