2013-01-09 30 views
5

我在node.js中使用pbkdf2進行散列密碼。crypto.pbkdf2是異步的,我如何將它視爲同步?

我的問題是,我正在響應身份驗證的請求,而且我正在進行身份驗證,如果傳遞的憑據是正確的。我假定pbkdf2是異步的,因爲它可能需要大量的時間(取決於迭代的大小)。然而,將剩餘的認證邏輯轉移到一個單獨的方法來利用回調看起來有點難看。

有沒有比使用計時器或將所有連續驗證邏輯放入單獨函數更好的方法?我知道大多數人會說我應該使用回調,但在我的用例中,這是沒有意義的。在我將pbkdf2應用於傳遞的密碼之前,我無法繼續進行身份驗證。

回答

4

我可以看到針對您的問題的兩種解決方案。

首先是使用一些庫來包裝異步調用。您可以嘗試node-syncnode-promisenode-sync更適合你想要的東西。

第二種解決方案是使用bcrypt而不是加密的:

var bcrypt = require('bcrypt'); 
var salt = bcrypt.genSaltSync(10); 
var hash = bcrypt.hashSync(password, salt); 

bcrypt是在節點的密碼哈希一個特殊的庫。內置加密模塊更安全,並提供了一些有用的方法,如hashSynccompareSync

+0

我是否正確地認爲bcrypt是基於blowfish(根據來自node.bcrypt.js項目的維基百科鏈接)?我使用的是pbkdf2,它的鹽大於128位,迭代次數爲10000次,這是經NIST批准的,而blowfish bcrypt則不是(參考wikipedia artical)。我只是好奇你的評論,bcrypt更安全。對我而言,這是最可能的。不是那麼重要,但我想用最安全的方法。 – Metalskin

+0

@Metalskin,我調查了一下。 'Bcrypt'在較短的路徑句中更強,但是它開始在長度超過55個字符的路徑字節上丟失「pbkdf2」。但他們都足夠安全,所以沒有真正的區別。看到[這個答案](http://stackoverflow.com/questions/4433216/password-encryption-pbkdf2-using-sha512-x-1000-vs-bcrypt)瞭解更多信息。 –

+0

感謝這個鏈接真的很有幫助,我不認爲我會超過55個字符,所以它應該可以使用bcrypt。看起來像scrypt會更好,但我找不到node.js的任何活動項目。 – Metalskin

5

根據Node.js crypto docs,同時存在PBKDF2函數的異步和同步版本。

crypto.pbkdf2(密碼,鹽,迭代KEYLEN,回調)

異步PBKDF2適用僞隨機函數HMAC-SHA1來導出 給定長度的從給定的密碼,鹽和迭代的關鍵。 回調得到兩個參數(err, derivedKey)

crypto.pbkdf2Sync(密碼,鹽,迭代KEYLEN)

同步PBKDF2功能。返回derivedKey或拋出錯誤。

+1

謝謝凱文,我不知道爲什麼我去年沒有看到。如果它有效,那麼這是一個更好的答案,因爲它是我真正想要的。當我有機會時,我會重新訪問代碼並進行測試。 – Metalskin