1

監査人に説明できるように、password_hash を完全に理解しようとしています。

私の答えの検索に基づいて、password_hash()関数が のラッパーであることを理解していますcrypt()事前定義された定数の PHP マニュアルを読んでいると、デフォルトの整数値として使用されていることがわかりPASSWORD_BCRYPTます (基本的には、CRYPT_BLOWFISHアルゴリズムを使用してパスワードをハッシュします)。

私を混乱させているのは、$options省略した場合、変数がランダムなソルトを生成し、コストが に設定されること10です。より高いコストを指定した場合 (例: 12)、ソルト値を指定していないため、ランダムなソルトが生成されますか? ここで混乱しているのは、 を省略しているのでは$optionsなく、別のコストを提供しているためです。

私の他の質問:

  • コスト値を上げるとセキュリティが向上するのはなぜですか?
  • password_hash()一方向のハッシュ関数でpassword_verify()あるため、ソルトがランダムであるため、パスワードを検証するにはどうすればよいですか?
  • ハッシュCRYPT_SHA512よりも強いですか?CRYPT_BLOWFISH
4

3 に答える 3

4

この記事は、パスワードを正しくハッシュする方法を理解するのに非常に役立ちます。ハッシュが弱い場合にさまざまな手法でハッシュをクラックする方法と、パスワードを正しくハッシュして十分なセキュリティを提供する方法について説明します。

より高いコスト (12 など) を指定した場合でも、ソルト値を指定していないため、ランダムなソルトが生成されますか?

はい、そうです -ドキュメントに記載されているように、ソルトが省略された場合、ハッシュされたパスワードごとに password_hash() によってランダムなソルトが生成されます (つまり、オプション配列からソルト値を省略した場合、それは password_hash() 関数によって生成されます)。デフォルト)。さらに、salt オプションは php 7.0 から非推奨になりました。

コスト値を増やすとセキュリティが向上するのはなぜですか?

これについては、上記の記事のセクションMaking Password Cracking Harder: Slow Hash Functionsでも説明されています。コストが高く設定されるほど、ハッシュ関数は遅くなります。アイデアは、ハッシュ関数を非常に遅くすることです。これにより、高速な GPU やカスタム ハードウェアを使用しても、辞書攻撃やブルート フォース攻撃は遅すぎて意味がありません。ただし、コストは (サーバーの仕様に基づいて) 妥当な値に設定する必要があります。これにより、ユーザーのパスワードを確認する際に大幅な遅延が発生することはありません。

さらに、CRYPT_SHA512 はハッシュに対して CRYPT_BLOWFISH よりも強力ですか?

それらの比較については、この投稿をお読みください。

于 2017-02-25T11:51:31.180 に答える
2

パスワードハッシュはcrypt()、基本的にラッパーで使用して機能します。ソルト、コスト、およびハッシュをすべて 1 つに含む文字列を返します。これは一方向のアルゴリズムであり、検証のために暗号化を解除せず、元の文字列をパスワードと共に渡すだけで、提供されたパスワードに対して同じハッシュが生成された場合に認証されます。

塩を省略して、塩を生成させるのが最善です。ソルトを 1 つだけ使用すると、その 1 つのパスワードだけでなく、すべてのパスワードを簡単に破ることができます。ソルトはコストに関係なく生成できます。

コスト (指数値) は、ハッシュの生成にどれだけの労力が費やされるかを示します (高いほど、ハッシュを生成するための計算能力が高くなります)。高すぎる値を設定しないでください。ログイン スクリプトが機能しなくなります。

于 2014-08-06T18:13:11.100 に答える
1

一般的に言えば:

パスワードをハッシュするときは、常にソルトを適用して、同じパスワードを持っていても異なるハッシュにする必要があります。これにより、ユーザーがレインボー テーブルを使用してパスワードをクラックするのを「防止」することで、セキュリティが強化されます。

しかし、bcrypt は独自にソルティングを処理します。

元の質問に戻ります。

コストは、辞書/ブルート フォース攻撃でパスワードをクラックするのに「コストがかかる」ようにするために使用されます。

Bcrypt は基本的にパスワードを何度もハッシュするため、特定のハッシュのパスワードを取得するのに時間がかかります (=コストがかかります)。ハッシュ (ブルート フォース攻撃) のパスワードを見つけようとすると、何十億ものパスワード ハッシュを計算する必要があります。各ハッシュに「$cost」倍の時間がかかる場合、ブルート フォース攻撃は実行できません。潜在的なパスワードのハッシュをミリ秒単位で計算できたとしても。

簡単に言えば、SHA-1 のパスワード ハッシュ (安全でないため、使用しないでください!) とソルト (通常、これはハッシュに含まれているため) があり、それをハッキングしたい場合は、可能な限りすべてハッシュする必要があります。 passwords + salt で、同じハッシュの組み合わせが見つかった場合、このハッシュの可能なパスワードが見つかりました。

適切なソルトと十分な長さのパスワードを使用すると、パスワード ハッシュに 1 ~ 5 秒ほどかかるとします。cost=10 でフグ アプローチを使用する場合、パスワード ハッシュに 10 ~ 50 秒かかります。単一のパスワードの場合、これは大したことではありません。したがって、単一のハッシュに対する直接攻撃は依然として単純ですが、通常、人々はユーザーとパスワードの組み合わせの大きなリストを取得し、それらすべてのパスワードをすばやく取得することに関心があります。そうすれば、悪者はすべてを計算するのに 10 倍の CPU パワーを必要とするため、これは悪者にとってはるかに有利ではありません。

于 2014-08-30T08:25:26.617 に答える