我正在尝试将 C# 程序转换为 JavaScript。 目的是根据存储在数据库中的 sha-256 哈希值验证明文密码。此代码将在服务器端执行。
C# 程序是根据这篇 MSDN 的文章 How to Hash Passwords 实现的。
为了验证我的实现,我得到了一个密码“test”的散列示例,其中随机生成了 4 个字符的长盐。
这是我到目前为止写的:
var unhashedPass = "test";
var originalHashedPass = "F27B595D3CBBC60ACEAC68E4DA6A2629558FEC383E0B81F764E443C68B0E9808096CDF2D";
var saltStringLength = 4;
var unicodeCharLength = 2;
var saltHexLength = unicodeCharLength * saltStringLength;
var saltHex = originalHashedPass.substr(0, saltHexLength);
var strSalt1 = String.fromCharCode(parseInt(saltHex.substr(0, 2), 16).toFixed());
var strSalt2 = String.fromCharCode(parseInt(saltHex.substr(2, 2), 16).toFixed());
var strSalt3 = String.fromCharCode(parseInt(saltHex.substr(4, 2), 16).toFixed());
var strSalt4 = String.fromCharCode(parseInt(saltHex.substr(6, 2), 16).toFixed());
//var strSalt = str2rstr_utf16le(strSalt1 + strSalt2 + strSalt3 + strSalt4);
var strSalt = strSalt1 + strSalt2 + strSalt3 + strSalt4;
var finalHash = saltHex + hex_sha256(strSalt + unhashedPass).toUpperCase();
return (finalHash == originalHashedPass);
此代码是我尝试过的多个变体之一,试图将十六进制盐转换为有效字符串(例如,参见注释行)。似乎都不起作用。
hex_sha256 和 str2rstr_utf16le 函数来自 this javascript SHA implementation
我假设我未能在 javascript 中正确“翻译”的 c# 部分是将 salt 转换为字符串。
binarySaltValue[0] = byte.Parse(saltValue.Substring(0, 2), System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture.NumberFormat);
binarySaltValue[1] = byte.Parse(saltValue.Substring(2, 2), System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture.NumberFormat);
binarySaltValue[2] = byte.Parse(saltValue.Substring(4, 2), System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture.NumberFormat);
binarySaltValue[3] = byte.Parse(saltValue.Substring(6, 2), System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture.NumberFormat);
我注意到 c# 实现使用字节数组,但我想我必须在 javascript 中使用字符串。
我还想知道我的问题是否与 c# 程序计算 Unicode 编码字符串有关。
你有什么建议吗?
编辑
为了澄清我的问题:我无法在 javascript 中根据 SHA256 加盐哈希值“F27B595D3CBBC60ACEAC68E4DA6A2629558FEC383E0B81F764E443C68B0E9808096CDF2D”(之前在 c# 程序中计算)验证密码“test”。
最佳答案
既然你说这是服务器端,我猜是 Node,在这种情况下:
https://github.com/brainfucker/hashlib
如果不是节点:
https://github.com/h2non/jsHashes
但这会比第一个慢,因为它是一个纯 JS 实现(第一个是在 C 中暴露给 JS)
关于c# - JavaScript 中的 SHA256 哈希密码验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9162824/