2013-01-09 20 views
5

私は、パスワードをハッシュするためにnode.jsにpbkdf2を使用しています。crypto.pbkdf2は非同期ですが、どうすれば同期として扱うことができますか?

私の問題は、私が認証要求に応答しており、渡された資格情報が正しい場合は認証の途中です。私は、pbkdf2が潜在的に(反復のサイズに依存して)長い時間を取る可能性があるので、非同期であると推測しています。しかし、残りの認証ロジックを別のメソッドに移動してコールバックを利用するのは面倒なようです。

タイマーを使用するか、連続した認証ロジックをすべて別の機能に投げるよりも優れたアプローチがありますか?ほとんどの人がコールバックを使うべきだと言っていますが、私のユースケースではこれは意味をなさないものです。私は渡されたパスワードにpbkdf2を適用するまで認証を続けることができません。

答えて

4

あなたの問題には2つの解決策があります。

まず、非同期呼び出しをラップするためにライブラリを使用します。 node-syncまたはnode-promiseをお試しください。 node-syncはあなたが望むものに適しています。

第2の解決策は、暗号の代わりにbcryptを使用することです:

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

bcryptは、ノード内のパスワードハッシュのための特別なライブラリです。より安全で、暗号モジュールを組み込み、hashSynccompareSyncのような便利なメソッドを提供します。

+0

私はbcryptがblowfish(node.bcrypt.jsプロジェクトのwikipediaリンク)に基づいていると仮定していますか?私は128ビット以上の塩と10000回の反復でpbkdf2を使用していましたが、これはNISTの承認を受けたものですが、ブリーフィングbcryptはそうではありません(wikipedia artical参照)。私はbcryptがより安全であるというあなたのコメントに興味があります。私の目的のために、それは最もprobです。それほど重要ではありませんが、私は最も安全なアプローチを使用したいと思います。 – 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を適用指定したパスワード、塩及び反復から所定の長さの鍵。 コールバックには2つの引数(err, derivedKey)があります。

crypto.pbkdf2Sync(パスワード、塩、イテレーション、KEYLEN)

同期PBKDF2機能。 derivedKeyを返すか、エラーをスローします。

+1

ありがとうKevin、なぜ私は去年見たことがないのか分かりません。それがうまくいくなら、それは私が実際に望んでいたより良い答えです。私はチャンスを得ると、コードとテストを再訪します。 – Metalskin

関連する問題