2014-06-06 81 views
2

剛剛按照關於如何在數據庫中存儲密碼的教程。他們使用以下方法來生成散列密碼:Node.JS Crypto.HMac代碼的生成

hasher.computeHash = function(source, salt) { 
    var hmac = crypto.crypto.createHmac("sha1", salt); 
    var hash = hmac.update(source); 
    return hash.digest("hex"); 
}; 

對於什麼都原因,我越來越糊塗當過我特地到密碼加密我一直使用的祕密,我附在鹽,但我可以」 t找到任何資源,這樣做這...我的意思是:

hasher.computeHash = function(source, salt) { 
    var saltNHash = salt + "super Secret LOOONG string!!"; 
    var hmac = crypto.crypto.createHmac("sha1", saltNHash); 
    var hash = hmac.update(source); 
    return hash.digest("hex"); 
}; 

這是一個壞的方法? 有沒有更好的方法在節點模塊內進行加密(將密碼存儲在數據庫中)?

謝謝,如果重複,很抱歉,我環顧四周,但我不認爲我知道正確的關鍵字谷歌。

回答

3

我嚴重推薦使用Todd Yandell's answer並使用bcrypt。緩慢的算法是真的你想要的密碼。這就是說,讓我也解決你的問題。

讓我們來談談我們爲什麼使用鹽。鹽是一種方式

  1. 減慢bruteforce企圖。
    如果您不使用salt,則會同時暴露具有相同密碼的兩個用戶。對每個散列分別提供所有內容,強制攻擊者將散列嘗試次數提高N級。
  2. 防止預計算攻擊,例如rainbow tables。這些攻擊使用相關散列的屬性,並在計算時間和存儲空間之間進行權衡,使無攻擊的攻擊算法(請參閱Windows XP)變得快速而輕鬆。

既然(我想!)你對每個密碼都使用隨機鹽,你已經到了那裏。

也就是說,你給所有東西附加祕密的方法確實沒有那麼有用。雖然它在技術上增加了一點複雜性;因爲它只是一個靜態字符串,所以它比沒有默認的安全性好。一旦發現一次奇異祕密(如果數據庫中甚至有一兩個弱密碼或者攻擊者可以訪問您的機器,則相當簡單),它就不再有用。堅持你的隨機鹽,你會(可能)會罰款。