Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# javascript中的SHA256哈希密码验证_C#_Javascript_Hash_Passwords_Sha256 - Fatal编程技术网

C# javascript中的SHA256哈希密码验证

C# javascript中的SHA256哈希密码验证,c#,javascript,hash,passwords,sha256,C#,Javascript,Hash,Passwords,Sha256,我正在尝试将c#程序转换为javascript。 其目的是根据存储在数据库中的sha-256哈希值验证明文密码。此代码将在服务器端执行 c#计划是根据MSDN的这篇文章实施的 为了验证我的实现,我得到了一个密码“test”的哈希示例,其中包含一个随机生成的4个字符长的salt 以下是我到目前为止写的内容: var unhashedPass = "test"; var originalHashedPass = "F27B595D3CBBC60ACEAC68E4DA6A2629558FEC383E0

我正在尝试将c#程序转换为javascript。 其目的是根据存储在数据库中的sha-256哈希值验证明文密码。此代码将在服务器端执行

c#计划是根据MSDN的这篇文章实施的

为了验证我的实现,我得到了一个密码“test”的哈希示例,其中包含一个随机生成的4个字符长的salt

以下是我到目前为止写的内容:

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);
这段代码是我尝试的多个变体之一,试图将十六进制salt转换为有效字符串(例如,请参见注释行)。似乎没有一个起作用

十六进制sha256和str2rstr utf16le函数来自

我假设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中验证密码“test”与SHA256盐渍哈希“f27b595d3cbbc60aceac68e4da2629558fec383e0b81f764e443c68b0e9808096cdf2d”(在c程序中计算)的对比。

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

如果不是节点,则:


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

考虑一下你的建议。通过使用Javascript,任何人都可以将Javascript推入页面,比如,
alert(unhashedPass)
,从而危及应用程序的安全性。您将容易受到MITM攻击以及其他javascript注入攻击。
var unhashedPass:String
不是有效的javascript。您不能声明显式变量类型。这将是服务器端执行的javascript,因此安全性不会成为问题。您最终要散列的数据是什么?是否正确,它是F27B 59 5d 74 65 73 74字节(四个salt字节,加上
“测试”
)?它散列到您在
originalHashedPass
中没有的内容(在这个变量中也没有预先添加的salt)。我不确定是否在跟踪您。我尝试散列的字符串在盐渍后看起来更像这样:“ò{Y]test”。我没有散列包含十六进制值的字符串(或者我应该吗?)。它不是Node.js,但无论如何,谢谢。我现在要测试jshash(虽然它看起来与jsSHA2非常相似……但我怀疑我的问题来自于我翻译十六进制编码的salt的方式,而不是哈希函数本身)。