如何有效地比较两个SHA512Managed哈希值

时间:2016-03-10 11:29:20

标签: c# string hash sha512

我使用SHA512Managed类来编写用户密码字符串。我最初创建了以下面的方式编码的标准具字符串:

  1. 将密码字符串(例如“Johnson_#1”)转换为字节数组;
  2. 使用SHA512Managed.ComputeHash获取此字节数组的哈希值 方法。如您所知,哈希值来自SHA512Managed.ComputeHash(byte []) 方法也是字节数组。
  3. 然后(在程序循环中)我通过以下方式将此哈希字节数组转换为字符串:

    System.Text.StringBuilder sBuilder = new System.Text.StringBuilder();
    for (int i = 0; i < passwordСache.Length; i++)
    {
        sBuilder.Append(passwordСache[i].ToString("x2"));
    }
    string passwordCacheString = sBuilder.ToString();
    

    其中passwordСache是​​哈希字节数组,passwordCacheString是结果字符串。

    最后,我将结果字符串存储在MS SQL Server数据库表中作为标准符号字符串。

    问题如下:如果我定期调用SHA512Managed.ComputeHash(byte [])方法并且每次传递与输入参数相同的字节数组(例如从“Johnson_#1”字符串获取),则返回的散列字节数组的内容会不时出现。

    所以,如果我将这样的哈希字节数组转换为字符串(如上所示)并将此字符串与数据库表中的etalon字符串进行比较,那么此字符串的内容将与标准字符串的内容不同,尽管相同的字符串(“约翰逊_#1”)的基础。

    更好地定义了问题

    我的问题是:有没有办法确定在相同字符串的基础上创建了两个具有不同内容的SHA512Managed哈希字节数组? Yuor帮助将受到高度赞赏。

1 个答案:

答案 0 :(得分:-1)

正如xanatos在他的评论中提到的,哈希函数必须是确定性的。 对于相同的输入,您将获得相同的哈希输出。

亲自试试:

            SHA512Managed sha512Managed = new SHA512Managed();

            for (int i = 0; i < 1000; i++) {
                var input = Guid.NewGuid().ToString();
                byte[] data = sha512Managed.ComputeHash(Encoding.UTF8.GetBytes(input));
                byte[] data2 = sha512Managed.ComputeHash(Encoding.UTF8.GetBytes(input));

                if (Encoding.UTF8.GetString(data) != Encoding.UTF8.GetString(data2)) {
                    throw new InvalidOperationException("Hash functions as we know them are useless");
                }
            }