SHA512対BlowfishおよびBcrypt [終了]


222

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

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

ありがとう。

更新:

ハッシュと暗号化の違いを理解していることを明確にしたいと思います。この方法で質問するように私を促したのはこの記事です。著者はbcryptを「適応型ハッシュ」と呼んでいます。

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


2
それは間違いではありません。bcryptの仕組みと、bcryptがハッシュベースの「一方向」アルゴリズムと同じ目的を果たす理由の説明については、私の回答の更新を参照してください。
エリクソン2009年

3
bcryptデフォルトでは単に「作業係数」が高くなっています。SHAは、...作業要素と一緒に使用できるpasshash9を使用しない限り、想定されていません。なぜこの質問は閉じられているのですか?それは答えには程遠いが、非常に重要である。

1
問題のリンクがダウンしている...............
Pacerier 2014

回答:


320

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)暗号の暗号解読メソッドはハッシュ関数の解読法よりも優れているという仮定に基づいています。


4
+1のすばらしい投稿。しかし、私は2つの質問があります。Blowfishは10年以上前にtwofishに置き換えられましたが、システムは最新のプリミティブを利用すべきではありませんか?また、多くの人が常にログインしているWebアプリケーションなどのシステムでは、何千回もの繰り返しが無駄に見えます。たとえば、PBKDF2は、暗号化されたファイルシステムのstring2key関数など、一度に1人がログオンするシナリオでのみ実装されます。「攻撃者が持ち上げるには重すぎる場合は、サーバーにとって重すぎる」という格言を使用します。どう思いますか?
2010年

17
よりモダンなプリミティブを使用しても問題はないと思います。脆弱性は時間の経過とともに発見されることが多く、TwofishはBlowfishから得た知識を使用して開発されました。ただし、私はBlowfishの使用を無効にする特定の脆弱性を認識していません。そのため、「破損した場合」の議論も可能です。攻撃者についての格言は私にはよく聞こえません。攻撃者が10億のパスワードをテストするのに何年もかかるアルゴリズムを選択したとしても、合法的なアプリケーションではごくわずかな時間しか消費しません。
エリクソン、2010年

15
ハッシュ関数の仕様を見ると、「塩」については何もわかりません。唯一のパラメータは、ダイジェストされるメッセージです。暗号の仕様を確認すると、関数がキーでパラメーター化されていることがわかります。ハッシュと組み合わせて使用できる(または使用できない)「塩」は、単にメッセージの一部です。ハッシュアルゴリズムはそれを必要とせず、特別に処理せず、メッセージの他の部分と区別できません。したがって、メッセージはソルトによって変更されることが多いのは事実です、特定のメッセージは1つのハッシュしか生成しません。
エリクソン2011年

1
@Andre Dペンテスターとして、アカウントをロックするアプリケーションを報告し、ブルートフォースを防止しないアプリケーションを報告します。理想的には、問題のあるIPアドレスがキャプチャを解決する必要があります。さらに、ユーザー名がターゲットの場合(そのユーザー名が存在しない場合でも)、認証前にそのアカウントでキャプチャを解決する必要があります。1分あたりXのレート制限を適用することも可能です。関連:security.stackexchange.com/questions/25444/...
ルーク

2
@rook:レート制限アプリケーションは良い習慣ですが、この場合、データベースがダウンロードされており、説明したレート制限のない機器に配置されていると想定できます。
Ellert van Koperen

50

私はエリクソンの答えに同意しますが、1つの注意点があります。パスワード認証の目的では、bcryptはSHA-512の1回の反復よりはるかに優れています。この特定のゲームでスローが有利である理由がわからない場合は、リンク先の記事をもう一度読んでください(「スピードは、パスワードハッシュ関数に必要なものではありません。」までスクロールします)。

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


3
うまくいけば、私の答えは、単一のハッシュ反復では不十分であることを明確にします(残念ながら、この初歩的な知識レベルでさえ想定することはできません)。「ハッシュ関数の1回の反復が使用される場合、攻撃者は数千ドルのコストがかかる機器を使用して数秒で数百万回の試行を行うことができます。ただし、数か月で最大8文字までのすべてのパスワードをテストします。ただし、ダイジェスト出力が何千回も「フィードバック」された場合、そのハードウェアで同じパスワードのセットをテストするには数百年かかるでしょう。Bcryptは、反復することで同じ「キー強化」効果を実現します... "
エリクソン

@エリクソン:はい、あなたはそこにリードを埋めたかもしれませんが。私が試みていた点は、bcryptとSHA-512の直接比較はあまり重要ではないということです。1つは鍵導出関数であり、もう1つは暗号プリミティブであり、それ自体では不適切です。
caf


1
何千ものラウンドのSHA-512を使用することは前例のないことではなく、さまざまなcrypt実装(使用しているPHPを含む)に含まれているため、元の質問を読んだとき、OPがSHA-512について尋ねたときにそれが何を意味するのかさえ推測しました-彼は実際には数百回のSHA-512対数百または数千の反復自体を使用するbcryptに言及していました。
thomasrutter 2015

33

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

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

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

トピックについてさらに読みたい場合は、ここにいくつかのリンクがあります:


18
問題は、ハッシュがその目的で使用されるのと同じくらい、パスワードの不可逆的な保護としてbcryptを使用することに関するものだと思います。
エリクソン2009年

3
@ericksonのテキスト「Q:BlowfishはSHA512より優れていますか?」私にはかなりはっきりしているようで、OPが2つのアルゴリズムの違いを理解していないことを示しています
Glen

1
OPはこちら。実際、blowfishは暗号化アルゴリズムである(私はハッシュとは異なると理解しています)というグレンの助言に基づいて、私は質問のyesが混乱していたことに気づきました。しかし今混乱しているのは、phpassクラス(私が信じているパスワードハッシュに使用)がbcrypt(つまり、blowfish、つまり暗号化)を使用していることです。ふぐが暗号化されている場合、phpassが暗号化してパスワードをハッシュするのはなぜですか?何か不足していますか?
クリス

2
ただし、質問では、リンゴとカンガルーのどちらが特定の作業により適しているかが尋ねられます。Blowfishはハッシュに時間がかかるため、shaよりも優れたハッシュ関数です。私が見たshaのほとんどの実装は非常に高速です。パスワードハッシュの遅いアルゴリズムが必要です。
John Nicholas

この回答は正解です。Blowfishは暗号化アルゴリズムですが、このコンテキストでは(たとえば、で使用される場合bcrypt)、ソース文字列からキーを導出し、それを使用してマジックナンバーを暗号化することにより、ハッシュアルゴリズムとして使用されます。これにより、不可逆的に、本質的にはハッシュ関数になります。平文と暗号化されたデータを知っていても、暗号からキーを計算することはできません。
thomasrutter 2015

4

Blowfishは、目的が異なるため、MD5やSHA512よりも優れていません。MD5とSHA512はハッシュアルゴリズムで、Blowfishは暗号化アルゴリズムです。2つの完全に異なる暗号化機能。


2

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

これらのアルゴリズムをJavaに移植したところ、ftp://ftp.arlut.utexas.edu/java_hashes/に無料でライセンスされたバージョンのアルゴリズムが見つかります。

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


PWDTK sourceforge.net/projects/pwdtknetはHMAC-SHA512を使用しますが、ここで他の人が話しているように、「スローネス」、つまりキーストレッチングを作成するために、多くの反復にわたってそのようにします。前述のように、BCryptは単一のSHA-512よりも優れていますが、PBKDF2などでSHA-512を使用する場合は、十分に安全です(大きな暗号ランダムソルトを使用し、時間を強制するのに十分な反復がある限り)レインボーテーブルを作成します)先ほど投稿したAPIは私が作成したもので、.NETで開発したいものであれば、それを実行します(将来の読者のために)
thashiznets

2

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

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

この記事の著者は間違っているのでしょうか?


2
彼が間違っているということではなく、ハッシュアルゴリズムの適用方法に関する豊富な文献を無視しているだけです。これらは、bcryptと同じように、主要な派生関数で繰り返し使用する必要があります。
エリクソン2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.