SHA256在javascript中散列密码验证

时间:2012-02-06 15:49:25

标签: c# javascript hash passwords sha256

我正在尝试将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#程序中计算)。

1 个答案:

答案 0 :(得分:1)

既然你说这是服务器端,我猜是Node,在这种情况下:

https://github.com/brainfucker/hashlib

如果它不是节点:

https://github.com/h2non/jsHashes

但是这比第一个要慢,因为它是纯粹的JS实现(第一个是在C中暴露给JS)