我試圖將一個C#程序轉換爲JavaScript。 其目的是驗證存儲在數據庫中的sha-256哈希的明文密碼。這段代碼將在服務器端執行。SHA256散列在javascript中的密碼驗證
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#程序前面計算)。
想想你是一個什麼再提議一秒鐘。通過在Javascript中執行它,任何人都可以將JavaScript推入頁面,例如'alert(unhashedPass)'並危害應用程序的安全性。您將很容易受到MITM攻擊以及其他JavaScript注入攻擊。 – 2012-02-06 15:52:49
'var unhashedPass:String'無效JavaScript。你不能聲明顯式變量類型。 – pimvdb 2012-02-06 15:55:20
這將是服務器端執行JavaScript,所以安全性不會成爲問題。 – 2012-02-06 15:57:34