結論: SHA-1は、プリイメージ攻撃に対して何よりも安全ですが、計算は簡単です。つまり、ブルートフォース攻撃や辞書攻撃を実装する方が簡単です。(SHA-256などの後継者についても同じことが言えます。)状況によっては、(bcryptなどの)計算コストが高くなるように設計されたハッシュ関数の方が適している場合があります。
「SHA-1が壊れている」という発言を頻繁に投げかける人もいるので、それが何を意味するのかを理解しようとしています。SHA-1パスワードハッシュのデータベースがあり、攻撃者が最先端のSHA-1破壊アルゴリズムと100,000台のマシンを備えたボットネットにアクセスするとします。(10万台の家庭用コンピューターを制御できるということは、1秒あたり約10 ^ 15の操作ができることを意味します。)
- 一人のユーザーのパスワードを見つけますか?
- 与えられたユーザーのパスワードを見つけますか?
- すべてのユーザーのパスワードを調べますか?
- ユーザーの1人としてログインする方法を見つけますか?
- 特定のユーザーとしてログインする方法を見つけますか?
パスワードがソルトされている場合、どのように変化しますか?ソルティングの方法(プレフィックス、ポストフィックス、その両方、またはxor-ingのようなより複雑なもの)は重要ですか?
これは、ググリングした後の私の現在の理解です。誤解した場合は正解してください。
- ソルトがない場合、レインボー攻撃はすべてのパスワード(非常に長いパスワードを除く)をすぐに見つけます。
- 十分に長いランダムソルトがある場合、パスワードを見つける最も効果的な方法は、ブルートフォースまたは辞書攻撃です。衝突攻撃やプリイメージ攻撃は実際のパスワードを見つけるのに役立ちません。そのため、SHA-1に対する暗号攻撃はここでは役に立ちません。どのアルゴリズムを使用するかは問題ではありません。MD5またはMD4を使用することもでき、パスワードも同じように安全です(SHA-1ハッシュの計算が遅いため、わずかな違いがあります)。
- 「同じくらい安全」であるかどうかを評価するために、1回のsha1の実行に1000の操作が必要で、パスワードに大文字、小文字、数字(つまり、60文字)が含まれていると仮定します。つまり、攻撃者は1 日に 10 15 * 60 * 60 * 24/1000〜= 10 17個の潜在的なパスワードをテストできるということです。ブルートフォース攻撃の場合、これはすべてのパスワードを3時間で最大9文字、1週間で最大10文字、1年で最大11文字までテストすることを意味します。(1文字追加するごとに60倍かかります。)辞書攻撃ははるかに速く(1台のコンピューターを使用している攻撃者でも数時間で攻撃を阻止できます)、弱いパスワードしか見つかりません。
- ユーザーとしてログインするために、攻撃者は正確なパスワードを見つける必要はありません。同じハッシュになる文字列を見つけるだけで十分です。これは最初のプリイメージ攻撃と呼ばれます。私の知る限り、SHA-1に対するプリイメージ攻撃はありません。(ブルートフォース攻撃は2 160回の操作が必要です。つまり、理論上の攻撃者がそれを阻止するには10〜30年必要です。理論的な可能性の限界は約2 60回の操作で、攻撃には数年かかります。)プリイメージ攻撃があります。影響がごくわずかなSHA-1の削減バージョンに対して(80ではなく44ステップを使用する削減SHA-1の場合、攻撃時間は2 160オペレーションから2 157に減少)。SHA-1に対する衝突攻撃がありますが、理論的な可能性の範囲内です(私が見つけた最善の方法は、時間を2 80から2 52に減らします)が、ソルトがなくても、パスワードハッシュに対しては役に立ちません。
つまり、SHA-1でパスワードを保存することは完全に安全に思えます。私は何か見落としてますか?
更新: Marceloは、2 106操作での2番目のプリイメージ攻撃について言及している記事を指摘しました。(編集:として、トーマスは説明して、この攻撃は現実のシナリオには適用されません仮想的な構造です。)私はまだかかわらず、鍵導出関数としてSHA-1を使用するためにどのようにこの呪文の危険性が表示されません。衝突攻撃または2番目のプリイメージ攻撃が最終的に1番目のプリイメージ攻撃に変わる可能性があると考えるのに、一般的に十分な理由はありますか?