web-dev-qa-db-ja.com

レインボーテーブル:削減の目的は何ですか?

これは this answer からのフォローアップです。

答えは非常によく、私は考えていくつかの研究をするようになりました。 このサイト で別の良い説明を見つけました。

ある時点で、著者は言う:

平文のセットが[0123456789] {6}(長さ6のすべての数値パスワードのレインボーテーブルが必要)で、ハッシュ関数がMD5()の場合、平文のハッシュはMD5( "493823")になる可能性があります- >「222f00dc4b7f9131c89cff641d1a8c50」。この場合、簡約関数R()は、ハッシュから最初の6つの数値を取得するのと同じくらい簡単かもしれません; R( "222f00dc4b7f9131c89cff641d1a8c50")-> "222004"。今、別の平文を生成しました以前の平文のハッシュから、これはリダクション関数の目的です。

しかし、削減はかなり恣意的であるように思われるので、私は削減の使用を把握していないようです。ハッシュを最初の数に減らすと、プレーンテキストの取得にどのように役立ちますか。削減の選択(つまり、ハッシュの最初の数個の選択)は本当に任意ですか? firstをとる代わりに、6つの数値はlast6つの数字?

3
Lex

簡約関数は、ハッシュ自体の中に平文候補をより多く格納するのに役立ちます。この記事では、非常に単純な削減の例を示します。ハッシュの最初の6つの数字「222f00dc4b7f9131c89cff641d1a8c50」を取ります。削減の結果、別の6桁のパスワード(222004)がハッシュされます。次に、そのハッシュから別のプレーンテキストパスワード候補が引き出され、長いチェーンが作成されます。 Rainbowテーブルには、その長いチェーンの最後のみが格納されます。すべてのハッシュを格納する必要はありません。チェーンを上に移動するときに、各ハッシュをリダクション関数から引き戻すことができるためです。

クラックしたいハッシュを与えると、最初に格納されているハッシュの最初のセットを調べます(これがこの長いチェーンの最終結果です)。ハッシュが偶然そこにある場合、平文を返して終了します。それ以外の場合は、チェーンの1つ上のステップに進み、そのハッシュを指定したハッシュと照合します。等々。

最初は、ある種のバケット操作が働いていて、ハッシュを探すために必要な場所の数が減ったと思いましたが、チェーンが元のハッシュに基づいてどこから開始するべきかについてのヒントを与えるとは思いません。それは単に、ストレージ要件の削減のためにメモリの集中的な作業を交換することです。

記事で述べているように、すべての平文がこのスキームで対応するハッシュを持つことは保証されていません。レインボーテーブルは、各列のリダクション関数を変更することにより、可能な限り多く取得します(そのため、レインボーテーブルはレインボーテーブルと呼ばれ、各列の色が異なると想定されています...)

3
mcgyver5

これは、ストレージと計算要件の間で妥協する方法です。

これは ハッシュテーブル の実装です:可能なすべての一意の値をテーブルに格納する代わりに(インデックスの格納と結果の検索に実際の問題が発生します)、必要な計算の数を減らすだけです。有効なハッシュを見つけてください。

基本的に、Rainbowテーブルを作成するときに、試行する各エントリの結果のハッシュ(ここでは、キースペースのサイズを縮小するため、縮小関数と呼ばれます)を作成します。次に、reduce関数の結果でラベル付けされたバケットに元の値を保存します。

Rainbowテーブルを使用するときは、次のことを行います。リバースするハッシュ値を取得し、reduce関数を介して渡し、そのタグが含まれているバケット内の内容を確認します。次に、その中の各要素をハッシュしようとします。バケットし、元の値と一致するかどうかを確認します。

適切なリデュース関数を選択する方法については、管理可能なチャンクに表示されるすべてのデータを再グループ化できる関数が必要です。いくつかの大きなバケットや小さなバケットが多すぎないようにする必要があります。そこでバランスを見つける必要があります。これ以外では、reduce関数をどのように選択するかはそれほど重要ではありません。データを統計的に等しいバケットに分割し、環境に合わせて簡単に処理できる、計算が簡単なものを使用する必要があります。 dむしろ最初の6の代わりに最後の6の数字を選択します。それは結局問題ではありません。

5
Stephane

Rainbowテーブルがどのように機能するかを説明する非常に優れたチュートリアルがあります: https://www.youtube.com/watch?v=rv06bwwAQqM

リダクションテーブルは、ハッシュコードからプレーンテキストにマッピングするテーブルです。例として、ハッシュコードの最初の6桁(たとえば、ハッシュコードabcd13450d3 ...の134503)を使用します。

リダクション関数は平文に均等に分配しようとし、平文にマッピングされる多くのハッシュコードをもたらさないようにします。ビデオで説明されているように、衝突が発生します。

リダクションとハッシュ関数が絡み合うと、ハッシュコードのドメインと平文を繰り返しマッピングする長いチェーンを形成することができます。

1
william007