web-dev-qa-db-ja.com

SHA512とBlowfishおよびBcrypt

ハッシュアルゴリズムを探していますが、答えが見つかりませんでした。

  • BcryptはBlowfishを使用します
  • BlowfishはMD5よりも優れています
  • Q:しかし、BlowfishはSHA512よりも優れていますか?

ありがとう。

更新:

ハッシュと暗号化の違いを理解していることを明確にしたいと思います。この方法で質問するように促されたのは この記事で、著者はbcryptを「アダプティブハッシュ」と呼んでいます

BcryptはBlowfishに基づいているため、Blowfishはハッシュアルゴリズムであると考えるようになりました。答えが指摘しているように暗号化されている場合は、この記事に掲載すべきではないと思われます。さらに悪いことに、彼はbcryptが最適であると結論付けています。また、私を混乱させているのは、phpassクラス(信じているパスワードハッシュに使用)がbcrypt(つまり、blowfish、つまり暗号化)を使用していることです。皆さんが私に言っているこの新しい情報に基づいて(blowfishは暗号化です)、このクラスは間違っているようです。何か不足していますか?

218
Chris

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は紛らわしく「ハッシュ」アルゴリズム自体と呼ばれます。

レインボーテーブルが塩の適切な使用によって妨害されたと仮定すると、真に不可逆的な機能は試行錯誤に攻撃者を減らします。そして、攻撃者が試行できる割合は、その不可逆的な「ハッシュ」アルゴリズムの速度によって決まります。ハッシュ関数の単一の反復が使用される場合、攻撃者は数千ドルの費用がかかる機器を使用して毎秒数百万回の試行を行い、数か月で最大8文字のパスワードをすべてテストできます。

ただし、ダイジェスト出力が何千回も「フィードバック」される場合、そのハードウェアで同じパスワードのセットをテストするには数百年かかります。 Bcryptは、キー派生ルーチン内で反復することにより、同じ「キー強化」効果を実現します。PBKDF2のような適切なハッシュベースのメソッドも同じことを行います。この点で、2つの方法は似ています。

したがって、bcryptの私の推奨は、1)BlowfishにはSHA-2ファミリーのハッシュ関数と同じレベルの精査があり、2)暗号の暗号解読法はハッシュ関数の暗号解読法よりも優れているという仮定に基づいています。

316
erickson

私はエリクソンの答えに同意しますが、1つの警告があります:パスワード認証の目的では、bcryptはSHA-の単一反復よりもfarよりも優れています512-単にずっと遅いからです。この特定のゲームでスローネスが利点である理由が分からない場合は、リンク先の記事をもう一度お読みください(「にスクロールダウンしてください。スピードは、パスワードハッシュ関数で望ましくないものです。 ")。

もちろん、SHA-512を中心とした安全なパスワードハッシュアルゴリズムは、PHKのMD5アルゴリズムと同様に、何千回も繰り返すことで構築できます。 lrich Drepperはまさにこれを行いました 、glibcのcrypt()に対して。ただし、テスト済みのbcrypt実装が既に利用可能な場合は、これを行う特別な理由はありません。

48
caf

Blowfishはハッシュアルゴリズムではありません。これは暗号化アルゴリズムです。つまり、blowfishを使用して何かを暗号化し、後で解読してプレーンテキストに戻すことができるということです。

SHA512はハッシュアルゴリズムです。つまり、(理論的には)入力をハッシュすると、元の入力を再び取得することはできません。

これらは2つの異なるもので、異なるタスクに使用するように設計されています。"SHA512よりもフグが優れていますか?"に対する「正しい」答えはありません。 "カンガルーよりもリンゴが良いですか? "

このトピックについてさらに詳しく知りたい場合は、次のリンクをご覧ください。

30
Glen

BlowfishはMD5やSHA512よりも優れているわけではありません。それらは異なる目的を果たしているからです。 MD5とSHA512はハッシュアルゴリズムであり、Blowfishは暗号化アルゴリズムです。 2つのまったく異なる暗号化機能。

4
blowdart

Ulrich DrepperのSHA-256/SHA-512ベースの暗号化実装をお勧めします。

これらのアルゴリズムをJavaに移植しました。これらのアルゴリズムの無料ライセンスバージョンは、 ftp://ftp.arlut.utexas.edu/Java_hashes/ で確認できます。

最新の(L)Unicesは、/ etc/shadowファイルでDrepperのアルゴリズムをサポートしていることに注意してください。

2
Jonathan Abbey

私はこれに出くわしました:

http://codahale.com/how-to-safely-store-a-password/

この記事の著者は間違っている可能性がありますか?

2
disappearedng