我使用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();其中密码passwordCacheString为散列字节数组,С为结果字符串。
最后,我将结果字符串存储在数据库表中,作为标准字符串。
问题在于:如果我定期调用SHA512Managed.ComputeHash(byte[])方法,每次向它传递与输入参数相同的字节数组(例如从"Johnson_#1“字符串获得),则返回的哈希字节数组的内容会不时不同。
因此,如果我将这种散列字节数组转换为string (如上面所示),并将此字符串与数据库表中的etalon字符串进行比较,则该字符串的内容将与etalon字符串的内容不同,但下面的字符串("Johnson_#1")将有所不同。
更好地定义这个问题
我的问题是:是否有一种方法可以确定在同一字符串的基础上创建了两个具有不同内容的比较SHA512Managed散列字节数组? Yuor help将受到高度赞赏。
发布于 2016-03-10 13:01:42
正如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");
}
}https://stackoverflow.com/questions/35915207
复制相似问题