bcryptまたはSHA-512(PBKDF2のような適切なアルゴリズムのコンテキストで)で十分かどうかを述べるだけで十分です。答えは「はい」です。どちらのアルゴリズムも安全であり、暗号解読ではなく実装の欠陥を通じて違反が発生します。
あなたがどちらが「より良い」かを知りたいと強く主張するなら、SHA-512はNISTや他の人たちによる詳細なレビューを受けています。それは良いことですが、現在は悪用可能ではありませんが、新しいハッシュアルゴリズムを求めるSHA-3競争につながっているという欠陥が認識されています。また、ハッシュアルゴリズムの研究は暗号の研究よりも「新しく」、暗号学者はまだそれらについて学んでいることに注意してください。
全体としてbcryptはBlowfish自体ほど精査されていませんが、よく理解された構造の暗号に基づいているため、ハッシュベースの認証にはない本質的なセキュリティが得られると思います。また、SHA-2ベースのハッシュを攻撃するツールとして一般的なGPUを使用する方が簡単です。メモリ要件のため、bcryptを最適化するには、オンボードRAMを備えたFPGAなどのより専門的なハードウェアが必要です。
注:bcryptは、Blowfishを内部で使用するアルゴリズムです。それ自体は暗号化アルゴリズムではありません。ハッシュ関数が「一方向ハッシュ」を行うために使用されるのと同じように、パスワードを不可逆的に不明瞭にするために使用されます。
暗号化ハッシュアルゴリズムは、元に戻すことができないように設計されています。言い換えれば、ハッシュ関数の出力のみを指定すると、同じハッシュ出力を生成するメッセージを見つけるのに「永久に」かかるはずです。実際、同じハッシュ値を生成する2つのメッセージを見つけることは、計算上実行不可能であるはずです。暗号とは異なり、ハッシュ関数はキーでパラメーター化されません。同じ入力は常に同じ出力を生成します。
誰かがパスワードテーブルに格納された値にハッシュするパスワードを提供すると、認証されます。特に、ハッシュ関数は元に戻せないため、ユーザーはハッシュを手に入れ、ハッシュを逆にして有効なパスワードを見つける攻撃者ではないと想定されます。
次にbcryptを検討します。これは、Blowfishを使用して、パスワードから「派生」したキーを使用してマジックストリングを暗号化します。その後、ユーザーがパスワードを入力すると、キーが再度生成され、そのキーを使用して暗号化することによって生成された暗号文が格納されている暗号文と一致する場合、ユーザーは認証されます。暗号文は「パスワード」テーブルに保存されますが、派生キーは保存されません。
ここで暗号を解読するために、攻撃者は暗号文からキーを回復する必要があります。これは「既知のプレーンテキスト」攻撃と呼ばれます。攻撃は暗号化されたマジックストリングを知っていますが、使用されたキーは知らないためです。Blowfishは広範囲にわたって研究されており、攻撃者が単一の既知の平文でキーを見つけることを可能にする攻撃はまだ知られていません。
したがって、不可逆アルゴリズムに基づく暗号ダイジェストと同様に、bcryptはパスワード、ソルト、およびコスト要因から不可逆出力を生成します。その強みは、既知のプレーンテキスト攻撃に対するBlowfishの耐性にあります。これは、ダイジェストアルゴリズムに対する「最初のプレイメージ攻撃」に類似しています。パスワードを保護するためにハッシュアルゴリズムの代わりに使用できるため、bcryptは混乱して「ハッシュ」アルゴリズム自体と呼ばれます。
レインボーテーブルがソルトの適切な使用によって妨害されたと仮定すると、本当に元に戻せない機能があれば、攻撃者は試行錯誤することができます。そして、攻撃者が試行できる率は、その不可逆的な「ハッシュ」アルゴリズムの速度によって決まります。ハッシュ関数の1回の反復が使用される場合、攻撃者は数千ドルのコストがかかる機器を使用して1秒あたり数百万回の試行を行い、数か月で最大8文字までのすべてのパスワードをテストできます。
ただし、ダイジェスト出力が数千回「フィードバック」された場合、そのハードウェアで同じパスワードのセットをテストするには数百年かかります。Bcryptは、キー導出ルーチン内で反復することによって同じ「キー強化」効果を実現し、PBKDF2のような適切なハッシュベースのメソッドは同じことを行います。この点で、2つの方法は似ています。
したがって、bcryptに対する私の推奨は、1)Blowfishがハッシュ関数のSHA-2ファミリーと同様のレベルの精査を行ったこと、および2)暗号の暗号解読メソッドはハッシュ関数の解読法よりも優れているという仮定に基づいています。