web-dev-qa-db-ja.com

php.netの「公式声明」:CRYPT_BLOWFISHは最強のハッシュアルゴリズムです。どうして?

最初:私はこの質問をstackoverflowで質問しましたが、ここにもう一度投稿するようにお願いされました。元の質問を見る ここ

新しいPHP 5.5パスワードハッシュ/暗号化APIの[初期]ドキュメントページによると、使用されているアルゴリズム_CRYPT_BLOWFISH_は「現在PHPでサポートされている最強のアルゴリズム」です(全文を入力してください)検索してページ上の見積もりを見つけます)。

私の質問は、これはいくつかの数値、ベンチマークなどで証明できますか?

PHPのcrypt()によると ドキュメントページ _CRYPT_BLOWFISH_は22文字のソルトを使用して60文字のハッシュを生成し、_CRYPT_SHA512_は16文字のソルトを使用して生成します118文字のハッシュ。どちらのアルゴリズムにも変更可能なコスト要因があるため、最初はSHA512の方が(長くなるため)強く見えます。

11
Sliq
  • ここでは、パスワードハッシュの最も強力な点について説明します。優れた汎用ハッシュは、優れたパスワードハッシュである必要はありません。逆も同様です。
  • ハッシュが特定のしきい値を超えると、ハッシュの長さは無関係になります。 nビットハッシュに対するプリイメージ攻撃のコストは2。 128ビットのハッシュの場合、これは完全に実行不可能です。
  • コストの指数表記を使用したbcryptと線形表記を使用したsha512-cryptは無関係です。 CPUコストをデフォルトのパラメーターと比較しても意味がありません。

    実際には、時間の予算、たとえば10msを選択します。次に、その予算に一致するようにハッシュのコスト係数を調整します。したがって、攻撃者が防御側と同じハードウェアを使用した場合、適切なパスワードハッシュはすべて同じになります。

  • 攻撃者は、防御側とは異なるハードウェアを使用します。防御側は標準のCPUを使用します。攻撃者は少なくともGPUを使用します。高度な攻撃者の場合は、おそらくFPGAまたはASICを使用します。

    異なるハッシュの違いは、さまざまな種類のハードウェアでどれだけうまく実行できるかです。 BCryptには、数キロバイトの非常に高速なメモリが必要です。これは一般的なCPUではうまく機能しますが、GPUではうまく機能しません。そのため、bcryptはGPUに非常に適していません。 FPGAでは、特にRAMが統合されている場合、bcryptの利点は小さくなります。しかし、それはまだ少し良いです。

  • 候補のハッシュを同じコストに調整できる単純なベンチマーク。次に、hashcatやjohn-the-ripperなどのGPUベースのパスワードクラッカーを実行し、そのパフォーマンスを確認します。私はbcryptのハッシュレートがはるかに低いことを期待しています。
  • Scryptと呼ばれる別の興味深いパスワード方式もあります。大量のメモリを使用し、時間予算が大きい場合は、bcryptまたはSHA512-cryptよりもはるかに優れています。
13
CodesInChaos

「数学的証明」は、Nを任意に選択できることです。

t(bcrypt) * (2^N) >> t(sha)

最後のハッシュは衝突を回避するためのものなので、次の条件が満たされていれば安全です

hash >> password

塩はすべてレインボーテーブルを避けるためのものなので、あなたが安全である限り

(Rainbow table size) * (salt) >> (attacker storage space)
1
Enos D'Andrea