まず、あなたは衝突について話しているのではありません。衝突とは、誰かが同じ値にハッシュする2つの異なるメッセージを見つけた場合です。ここでは、公開した値にハッシュする別の入力を誰かが見つけることを恐れていません。確かに、あなたは誰かがあなたの入力を見つけることを恐れています。正しい用語は原像攻撃です。攻撃者がハッシュ関数を「反転」しようとしている(特定の出力に一致する入力を見つけようとしている)と言うことがあります。
特定のハッシュ値のプレイメージを見つけるには、ハッシュ関数の弱点を利用する方法と、候補を試して入力を推測する方法の2つがあります。
原像耐性に関してSHA-2の既知の弱点はありません。結局のところ、MD5、さらにはMD4にもそのような既知の弱点はありませんが、これら2つの機能は、暗号的に言えば、完全に壊れていると考えられています。したがって、ハッシュ関数に関する科学的研究の驚異的な進歩を除けば、ハッシュ関数の暗号化の弱点によってハッシュ値が見つからない可能性があります。
攻撃者が入力について知っていることによっては、候補者を試すことができる場合とできない場合があります。これを正確にモデル化するのは非常に困難です。たとえば、入力が7文字を含む単一の単語であるとします。26 7 =8031810176そのような単語があります。それらすべてをSHA-256で試して、毎回ハッシュ値と比較するのは、単純な実装の最近のPCでは数分かかります。
より一般的には、可能な入力のセットを探索することは、ユーザーパスワードの回復の問題に適用されることが多いため、辞書攻撃と呼ばれます。ユーザーは想像を絶するほど想像力に欠け、限られた一連の「単語」からパスワードを選択することがよくあります。 、そしてその単語のセットを「辞書」と呼ぶのは理にかなっているようです。これを「ブルートフォース」または「全数検索」とも呼びます。
辞書が攻撃者がすべての単語を現実的に試すのに十分小さいと仮定すると、ハッシュ値が最終的に反転されるだけでなく(攻撃者に十分なインセンティブがある場合)、これはコスト共有の道も開きます:攻撃者は、いくつかの同様の攻撃状況でコンピューティングの取り組みを共有しようとする可能性があります(つまり、同じハッシュ関数を使用して、いくつかのハッシュ値を反転します。ここでも、一般的なパスワード関連の攻撃モデルです)。基本的なコスト共有方法は、事前に計算されたテーブルを作成することです。攻撃者は、辞書のすべてのハッシュを1回計算します。; 次に、テーブルでハッシュ値を検索するだけで、後続のすべてのハッシュ値を攻撃できます。ルックアップは非常に高速です(攻撃者はハッシュを昇順で並べ替えます)。レインボーテーブルは、コンパクトな表現を可能にするスマートな方法で、一種の事前計算されたテーブルです。攻撃者は、トラックに大量のハードディスクを必要とせずに、大きな事前計算されたテーブルを「保持」することができます。それでも、虹であろうとなかろうと、テーブル内のすべての値(前の値)レインボーテーブルの場合の圧縮)は、攻撃者がどこかで少なくとも1回計算する必要があります。つまり、誰かが完全な辞書攻撃を実行できるようにする必要があります。これには2つのコストがあります。CPUコスト(すべてのハッシュを計算するため)とストレージコスト(ハッシュ値を格納するため)です。レインボーテーブルはストレージを安くしますが、CPUに関しては改善されません。
塩漬けは、事前に計算されたテーブル(レインボーテーブルを含む)を打ち負かします。それは小さな辞書をより許容できるものにします。つまり、1つのハッシュ値を反転することが可能であると仮定すると、ソルトは、少なくとも、攻撃者が辞書攻撃のCPUコストを毎回全額支払う必要があり、共有できないことを確認します。いくつかの攻撃または他の攻撃者との彼のコスト。一般的なユーザーに、考えられるパスワードの十分な数のセットからパスワードを選択して記憶させることは、一般的に不可能であることが判明したため、パスワードにはソルティングが必要です。
入力が、1回のブルートフォース攻撃を打ち負かすのに十分な大きさの辞書からのものである場合は、さらに優れています。重要なのは、入力文字列が取る可能性のある値のセットのサイズです。そのセットは、攻撃者が攻撃されたデータについて知っていることに関して推定する必要があります。たとえば、攻撃者がユーザーパスワードを見つけようとしている場合、攻撃者は入力文字列が短く(ユーザーの忍耐力がほとんどない)、キーボードで(盲目的に!)入力できる文字のみで構成されていることを知っています。また、シーケンスを記憶できることも知っているため、「。%f *(。ds /〜\ d09j@」のようなものはほとんどありません。入力サイズ自体に制限はありません。レインボーテーブルは限られていると言えます。 「15文字程度」まで 15文字を超える入力を受け入れるユーザーは、テーブルの構築に必要な1回の総当たり攻撃を許可するには、大きすぎるセットからパスワードを選択するためです。しようとしていることに注意してください15文字のすべてのシーケンスはすでに多すぎます(15の小文字のすべてのシーケンスでさえ270を超えるハッシュ計算を意味し、それは今日のテクノロジーでは実際には実現可能ではありません)。