我使用 Crypto-JS v2.5.3 (hmac.min.js) http://code.google.com/p/crypto-js/计算客户端哈希的库和脚本是:
$("#PasswordHash").val(Crypto.HMAC(Crypto.SHA256, $("#pwd").val(), $("#PasswordSalt").val(), { asByte: true }));
这会返回这样的东西:
b3626b28c57ea7097b6107933c6e1f24f586cca63c00d9252d231c715d42e272
然后在服务器端我使用下面的代码来计算哈希值:
private string CalcHash(string PlainText, string Salt) {
string result = "";
ASCIIEncoding enc = new ASCIIEncoding();
byte[]
baText2BeHashed = enc.GetBytes(PlainText),
baSalt = enc.GetBytes(Salt);
System.Security.Cryptography.HMACSHA256 hasher = new HMACSHA256(baSalt);
byte[] baHashedText = hasher.ComputeHash(baText2BeHashed);
result = string.Join("", baHashedText.ToList().Select(b => b.ToString("x")).ToArray());
return result;
}
此方法返回:
b3626b28c57ea797b617933c6e1f24f586cca63c0d9252d231c715d42e272
如您所见,服务器端方法只忽略了一些零字符。哪里有问题?我的服务器端方法有什么问题吗?我只需要这两个值与相同的字符串和盐相同。
最佳答案
As you see there is just some zero characters that the server side method ignore that. where is the problem?
此处 - 在 C# 中转换为十六进制:
b => b.ToString("x")
如果 b
是 10,那只会给出“a”而不是“0a”。
我个人建议使用更简单的十六进制转换:
return BitConverter.ToString(baHashedText).Replace("-", "").ToLowerInvariant();
(您可以只是将 "x"
更改为 "x2"
,以指定 2 个字符的长度,但它仍然是一个执行字节到十六进制转换的某种迂回方式。)
关于c# - HMACSHA256 在计算哈希时忽略零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12049395/