我正在尝试将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
我认为c#部分我在javascript中无法正确“翻译”是将盐转换为字符串。
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中验证密码“test”对其的SHA256盐渍哈希“F27B595D3CBBC60ACEAC68E4DA6A2629558FEC383E0B81F764E443C68B0E9808096CDF2D”(先前在c#程序中计算)。
答案 0 :(得分:1)
既然你说这是服务器端,我猜是Node,在这种情况下:
https://github.com/brainfucker/hashlib
如果它不是节点:
https://github.com/h2non/jsHashes
但是这比第一个要慢,因为它是纯粹的JS实现(第一个是在C中暴露给JS)