我使用SHA512Managed类来编写用户密码字符串。我最初创建了以下面的方式编码的标准具字符串:
然后(在程序循环中)我通过以下方式将此哈希字节数组转换为字符串:
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帮助将受到高度赞赏。
答案 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");
}
}