首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何有效地比较两个SHA512Managed哈希值

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

Stack Overflow用户
提问于 2016-03-10 11:29:20
回答 1查看 1.7K关注 0票数 2

我使用SHA512Managed类编码用户密码字符串。我无意中创建了以折页方式编码的标准龙字符串:

  1. 将密码字符串(例如"Johnson_#1")转换为字节数组;
  2. 使用SHA512Managed.ComputeHash方法获取此字节数组的哈希值。如您所知,从SHA512Managed.ComputeHash(byte[])方法获得的哈希值也是字节数组。

然后(在程序循环中),我以以下方式将这个散列字节数组转换为字符串:

代码语言:javascript
复制
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();

其中密码passwordCacheString为散列字节数组,С为结果字符串。

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

问题在于:如果我定期调用SHA512Managed.ComputeHash(byte[])方法,每次向它传递与输入参数相同的字节数组(例如从"Johnson_#1“字符串获得),则返回的哈希字节数组的内容会不时不同。

因此,如果我将这种散列字节数组转换为string (如上面所示),并将此字符串与数据库表中的etalon字符串进行比较,则该字符串的内容将与etalon字符串的内容不同,但下面的字符串("Johnson_#1")将有所不同。

更好地定义这个问题

我的问题是:是否有一种方法可以确定在同一字符串的基础上创建了两个具有不同内容的比较SHA512Managed散列字节数组? Yuor help将受到高度赞赏。

EN

回答 1

Stack Overflow用户

发布于 2016-03-10 13:01:42

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

你自己试试吧:

代码语言:javascript
复制
            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");
                }
            }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35915207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档