c# - JavaScript 中的 SHA256 哈希密码验证

标签 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

我假设我未能在 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/

相关文章:

python - Python 集合的随机化程度如何?

c++ - 将玩家回合存储在 Zobrist 哈希值中

c# - 带有全选复选框的多选 ListView 。绑定(bind)属性上的数据触发

c# - 将 Regex.Matches 连接到一个字符串

javascript - CORS 和 Angular header 身份验证的烦人问题

javascript代码填充html段落

javascript - 如何在特定日期和时间创建 `Temporal.Instant` 的实例?

c# - 在 C# 中等待 Selenium Web 驱动程序中的标签标签文本

javascript - 使用 SAS key 直接从客户端上传到 Azure 存储

perl - 在 perl 中对哈希键进行排序,键是制表符分隔的