web-dev-qa-db-ja.com

鍵導出関数としてのBcrypt?

私はスタック交換でbcryptと パスワードの保存に関してPBKDF2より優れていると思われる理由 について多くのエントリを読みました。

キーの導出に関して、bcryptがPBKDF2よりも優れているかどうかを今尋ねています。私の場合、AES暗号化用の対称鍵(例えば、256ビットの鍵長)のみを導出する必要があります。このキーは保存する必要はありません。暗号化のためにオンザフライでのみ使用されます。このシナリオでは、PBKDF2よりbcryptの方が優れていますか?

乾杯、ピット

9
Pits

Bcryptは192ビットの結果を出力します。 192ビットより長いキーが必要な場合、これは不便です。 256ビットのAESキー。そのような状況では、bcryptの出力を取得し、必要なキーマテリアルの長さに対して十分な出力を持つ安全なハッシュ関数でハッシュすることをお勧めします(たとえば、256ビットの暗号化キーが必要な場合および128ビットMACキー、SHA-384またはSHA-512を使用)。それ以外の場合、キーの導出に関する限り、bcryptは問題ないと見なされます。

(192ビットの値から256ビットの暗号化キーを生成することはあまり意味がありません。しかし、128ビットのAESの代わりに256ビットのAESを使用することも、実際にはあまり意味がありません。bcryptベースの本当の弱点システムはとにかく、キーは人間が覚えているパスワードから来るということです; bcryptはそのようなことを許容しますが、本当にランダムな128ビットキーほど安全ではありません。 192ビットまたは256ビットのキーよりも少ないため、「管理上の理由」で256ビットのキーが必要な場合、bcrypt出力とハッシュ関数からキーを生成しても、実際のセキュリティ上の問題は発生しません。)

Bcryptにはマイナーな癖があり、192ビットのbcrypt出力を3つの64ビット値に分割すると、3つの64ビット値が互いに異なることが数学的に保証されます。したがって、bcryptの出力は、約2を調べることで ランダムOracle の出力と区別できます。64 個別のbcrypt出力(ランダムな192ビット値の場合、ブロックコリジョンが発生することが予想されます-互いに等しい3つの64ビット値のうちの2つ-平均2の後64/ 3の値)。これは非常にわずかなバイアスであり、セキュリティに実際的な影響はありません。

7
Thomas Pornin