web-dev-qa-db-ja.com

BcryptとPBKDF2を一緒に使用することは理にかなっていますか?

BcryptとPDBKF2のどちらがより良い鍵導出ハッシュ方法であるかについて、私はさまざまな意見を読みました。答えは、分析が難しい複雑な要素の多くに依存しているようです。それらの両方を使用すると(おそらく順番に順次)、両方の利点が得られ、最適な安全ソリューションが実現しますか?

9
Dan

2つの関数を混合しても、実際には効果がありません。 BcryptとPBKDF2のどちらにも設定可能なコストがあります。利用可能なハードウェアと環境の制約(例:平均的なユーザーの忍耐力)を考慮して、繰り返しの数を状況で許容できる最大値に設定することになっています。両方の機能を一緒に使用する場合、それらは同じCPUバジェットを共有する必要があります。つまり、どちらかの関数だけで使用する場合と比較して、反復回数を減らす必要があります。

だからあなたはそのように強いものを得ることはありません。代わりに、Bcryptのみ、またはPBKDF2のみを使用した場合と同じセキュリティレベルが得られます。

2つのハッシュ関数または類似の関数を組み合わせることは、破壊されたことが判明した場合に壊滅的な障害を回避するのに適しています。ただし、BcryptとPBKDF2の両方が強力で、問題は主にパフォーマンスに関するものであると想定します(bcryptとPBKDF2の両方は、徹底的な検索を遅くすることなので、これはすべてパフォーマンスに関するものです)。最適な速度を得るために、bcryptとPBKDF2を組み合わせるのはしないのが得策です。

BcryptとPBKDF2のどちらを選択するかについては、 この前の回答 を参照してください。まとめると:

  • ハードウェアがPCに似ている(つまり、数キロバイトのRAMが高速アクセスの場合)場合、Bcryptの方が優れています。bcryptを使用している場合、攻撃者がGPUで徹底的な検索を最適化することは困難です。 PBKDF2と比較。

  • PBKDF2にはNISTの恵みがあります(承認され、大きな「A」が付​​いています)。 NISTはbcryptについては何も述べていません。

  • Bcryptは192ビットを出力しますが、これはパスワード検証トークンとしては十分です。または、192ビット(またはそれ以下)のパスワードから派生したキーマテリアルが必要な場合のみです。一方、PBKDF2は 鍵導出関数 であり、必要な数のビットを生成できます。これは、192ビットを超える鍵データが必要な場合に適しています。

11
Thomas Pornin