2012-02-06 69 views
2

我試圖將一個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#程序前面計算)。

+1

想想你是一個什麼再提議一秒鐘。通過在Javascript中執行它,任何人都可以將JavaScript推入頁面,例如'alert(unhashedPass)'並危害應用程序的安全性。您將很容易受到MITM攻擊以及其他JavaScript注入攻擊。 – 2012-02-06 15:52:49

+0

'var unhashedPass:String'無效JavaScript。你不能聲明顯式變量類型。 – pimvdb 2012-02-06 15:55:20

+1

這將是服務器端執行JavaScript,所以安全性不會成爲問題。 – 2012-02-06 15:57:34

回答

1

既然你說這是服務器端,我猜節點,在這種情況下:

https://github.com/brainfucker/hashlib

如果是其他的東西比節點:

https://github.com/h2non/jsHashes

但這將比第一個慢,因爲它是一個純粹的JS實現(第一個是在C暴露給JS)

+0

這不是Node.js,但無論如何感謝。我現在要測試jsHash(雖然它看起來與jsSHA2很相似......我懷疑我的問題來自我翻譯十六進制編碼的鹽而不是散列函數本身)。 – 2012-02-06 16:57:25