前提として、パスワードを解読したいとします。 Time Memory Trade-Off Attacksを使用すると、考えられるすべてのパスワードのハッシュを計算するために時間間の適切なバランスを見つけようとします。そして、ルックアップが瞬時に行われるすべてのパスワードハッシュタプルを格納するために使用されたメモリ。
(ソルト、ペッパー、2要素認証などの追加のセキュリティメカニズムについて知っています...)
しかし、私が理解していないことは、そのトレードオフは攻撃時に起こります。しかし、通常、人の寿命、数世紀、さらには太陽の寿命の間に、適切なパスワードを解読するための時間を耳にします。
そのため、そのようなテーブルの生成は、短いパスワードに対してのみ実行可能ですよね?
たとえば、 zxcvbn を使用して、9文字の長いパスワードで次の結果を得ました。
password: evhtsxuko
entropy: 42.304
crack time (seconds): 271475183.949
crack time (display): 10 years
したがって、bcrypt
は低速ハッシュ関数であり、約15年間存在しますが、NSAであっても、bcryptでハッシュされた10文字のパスワードは不可能であると想定しても安全です。亀裂?
"Time-Memory Trade-Off"は、より多くのスペース(メモリ)を使用して実行時間を改善(短縮)するアルゴリズムの一般的な用語です。または、同様に、より多くの計算時間を犠牲にして、メモリ使用量を改善します(つまり、使用量を減らすRAMまたはディスク、またはランダムアクセスではなくシーケンシャルアクセスを使用するなど)。
パスワードハッシュの場合、メインのTMTOアルゴリズムは Hellman によるもので、1980年に遡ります。後にいくつかのローカルな改善が発見され、その結果、口語的には Rainbow tables と呼ばれるものになりました。スペクトルの2つのエンドポイントを検討することで、レインボーテーブルの概念図を取得できます。
徹底的な検索は、すべての潜在的なパスワードを試し、それらをすべてハッシュし、その値をクラックされるパスワードと比較することです。これは計算コストが最も高い(平均N/2ハッシュを計算する[〜#〜] n [〜#〜]確率が一定の潜在的なパスワード)を使用しますが、使用するRAMはごくわずかです。
事前計算されたテーブルには、[〜#〜] n [〜#〜]の潜在的なパスワードのハッシュが含まれ、1回のルックアップが必要です行われなければ。テーブルはbuildingの労力は数えません。これは、おそらく複数の攻撃者が複数の攻撃に再利用できるためです。テーブルのサイズは[〜#〜] n [〜#〜]に比例しますが、計算の労力はごくわずかです(まあ、O (logN)、小さい)。
レインボーテーブルが間に収まります。テーブルを作成するときに、「平均チェーン長」と呼ばれるパラメーターtを選択します。テーブルサイズはN/tに比例します。事前計算されたテーブルと比較して、tの係数で減少します。一方、各攻撃はtに比例する計算量を意味します2ハッシュ計算、およびtルックアップ。運用条件に応じて、ルックアップまたは計算がボトルネックになります(たとえば、テーブルがRAM内にあるか、SSD上にあるか、または一連の機械的ハードディスクにあるかに大きく依存します)。
ソルトは、レインボーテーブルを含む事前計算済みテーブルを完全に阻止します。 [〜#〜] n [〜#〜]の事前計算テーブルを作成すると、コストがかかります[〜#〜] n [〜#〜];同じ[〜#〜] n [〜#〜]パスワードに対してレインボーテーブルを作成すると、コストがさらに高くなります(約1.7 * N)。これは、2つの異なるハッシュ値を攻撃するためにテーブルを少なくとも2回使用できる場合にのみ、努力する価値があります。ワンショットテーブル(レインボーかどうかにかかわらず)は、徹底的な検索と競合しません。しかし、saltのポイントは、one関数がないことです。実際、関数には大きなファミリがあり、salt値は実際に使用されている関数を示します。特定のソルト用に作成されたテーブルは、他のソルトのハッシュ値を壊すことにはまったく価値がありません。
Bcryptはソルトを使用するため、テーブルもTMTOもありません。攻撃者は徹底的な検索に戻ります。 Bcryptは、徹底的な検索に対する武器、つまり、膨大な数の内部反復によって取得される構成可能な速度を備えています。ユーザーの観点からは、1マイクロ秒かかるハッシュ計算と100ミリ秒かかるハッシュ計算との間に大きな違いはありません。 ;しかし、攻撃者にとって、後者は彼の徹底的な検索の労力の10万倍を意味します。
安全なパスワードハッシュの詳細については、 この回答 を参照してください。簡単な要約:パスワードが強力な場合(つまり、エントロピーが高い場合)、強力な機関でさえ、bcryptハッシュを前もって破って取得することはできません(ひざまずいてパスワードを取得しますが、それはまた別の話です)。
Bcryptは2つのパラメーターを受け取ります。パスワードと作業係数です。作業係数は、問題に費やす時間を示します。
作業係数が異なれば結果も異なるため、作業係数は一種の二次塩として機能します。通常はそのように考えていませんが、ハッシュデータベースでbcryptがめったに見られない理由の一部です。ハッシュを一致させるには、パスワードと彼の正しい作業係数の両方が必要です。そのため、データベースでは、潜在的なすべての作業要素に対して個別のbcryptハッシュのセットが必要です。
NSAが10文字のbcryptハッシュをクラックできるかどうかについては、確率の非常に遠い側にありますが、完全に可能性の奥にあるわけではありません。最大14文字にジャンプし、あなたはほとんどそれを持っています。
Bcryptは「作業係数」を使用します。作業係数が高いほど、特定のキースペースに必要な処理が多くなります。
「時間」の見積もりに関して、攻撃者はどのようなリソースを持っていると予測されていますか?見積もりがN個のリソースに基づいていて、攻撃者が1000N個のリソースを投入した場合、攻撃者はキースペースを使い果たすか、1/1000の時間でルールベースの辞書攻撃を実行できます。
実際の時間とメモリのトレードオフに関して、長いランダムなソルトがある場合、ソルトのすべての可能な値に対して事前計算されたリストを生成する合理的な方法がないため、それはすべて実行時の作業です。 WPAソルトはまれではないSSIDであるため、リストを生成できます。
また、パスワードが完全にランダムでない場合は、ルールベースの辞書攻撃が最悪の危険であり、純粋な総当たり攻撃やマルコフ連鎖でさえないことにも注意してください。
また、その強度の推定では、ムーアの法則(または他の指数増加係数)が考慮されていますか? 「太陽の寿命」の推定値はすべて、攻撃者が新しいハードウェアが良くなった後に購入することを説明できていません。