私がいつも考えていた1つの概念は、暗号化ハッシュ関数と値の使用です。これらの関数は一意であり、元に戻すことは事実上不可能なハッシュ値を生成できることを理解していますが、私がいつも考えていたのは次のとおりです:
私のサーバーで、PHPを作成する場合:
md5("stackoverflow.com") = "d0cc85b26f2ceb8714b978e07def4f6e"
同じ文字列をMD5関数で実行すると、PHPインストール。プロセスは開始値から値を生成するために使用されます。
これは、何が起こっているかを解体し、ハッシュ値を逆にする何らかの方法があることを意味しませんか?
結果の文字列をリトレースすることを不可能にするこれらの関数についてはどうですか?
入力素材の長さは無限にすることができ、出力の長さは常に128ビットです。これは、無限数の入力文字列が同じ出力を生成することを意味します。
乱数を選択し、それを2で除算し、残りのみを書き留めると、0または1のいずれか(それぞれ偶数または奇数)が得られます。その0または1を取り、元の番号を取得することは可能ですか?
MD5などのハッシュ関数が可逆的だった場合、データ圧縮アルゴリズムの歴史において重要な出来事でした! MD5が可逆的である場合、任意のサイズのデータの任意のチャンクは、情報を失うことなく、わずか128ビットで表すことができるのは簡単です。したがって、元のメッセージのサイズに関係なく、128ビットの数値から元のメッセージを再構築できたはずです。
ここで最も支持された答えが強調するものとは反対に、大きな(潜在的に無限の)入力の違いによって引き起こされる暗号ハッシュ関数の非単射(つまり、同じ値にハッシュする複数の文字列がある)サイズと固定出力サイズ重要なポイントではありません –実際、これらの衝突が可能な限り発生しないハッシュ関数を好みます。
この関数を考えてください(質問としてPHP表記)):
function simple_hash($input) {
return bin2hex(substr(str_pad($input, 16), 0, 16));
}
これは、文字列が短すぎる場合にいくつかのスペースを追加し、文字列の最初の16バイトを取得して、16進数としてエンコードします。 MD5ハッシュと同じ出力サイズ(32桁の16進文字、またはbin2hex部分を省略すると16バイト)になります。
print simple_hash("stackoverflow.com");
これは出力されます:
737461636b6f766572666c6f772e636f6d
この関数には、MD5に対するCodyの回答で強調されているものと同じ非注入性のプロパティもあります:任意のサイズの文字列を(コンピューターに収まる限り)渡すことができ、32桁の16進数のみを出力します。もちろん、単射ではありません。
ただし、この場合、同じハッシュにマップされる文字列を見つけるのは簡単です(hex2bin
あなたのハッシュで、あなたはそれを持っています)。元の文字列の長さが16の場合(この例のように)、この元の文字列も取得できます。入力の長さが非常に短いことがわかっていても、MD5ではこの種のことは不可能です(一致する入力、たとえばブルートフォース攻撃が見つかるまで、可能なすべての入力を試すこと以外)。
暗号化ハッシュ関数の重要な前提条件は次のとおりです
明らかに私のsimple_hash
関数は、これらの条件のいずれも満たしません。 (実際、入力スペースを「16バイト文字列」に制限すると、関数は単射になり、2番目のプリイメージ耐性と衝突耐性も証明可能になります。)
現在、MD5に対する衝突攻撃が存在します(たとえば、同じプレフィックスを持ち、同じハッシュを持ち、かなりの作業がありますが、不可能ではない多くの作業で、1組の文字列を生成することができます)。重要なものにはMD5。プリイメージ攻撃はまだありませんが、攻撃は改善されます。
実際の質問に答えるには:
結果の文字列をリトレースすることを不可能にするこれらの関数についてはどうですか?
MD5(および他のハッシュ関数がMerkle-Damgard構造上に構築)が効果的に行うのは、結果の暗号文をハッシュとして使用して、メッセージをキー、固定値を「プレーンテキスト」として暗号化アルゴリズムを適用することです。 (その前に、入力はパディングされてブロックに分割され、この各ブロックは前のブロックの出力を暗号化するために使用され、逆計算を防ぐために入力とXORされます。)
現代の暗号化アルゴリズム(ハッシュ関数で使用されるものを含む)は、平文と暗号文の両方が与えられた場合でも(または敵がそれらのいずれかを選択した場合でも)キーの回復を困難にする方法で作成されます。一般的には、各出力ビットが各キービット(数回)および各入力ビットによって決定されるように、多くのビットシャッフル操作を行うことでこれを行います。この方法では、完全なキーと入力または出力のいずれかを知っている場合にのみ、内部で発生したことを簡単にリトレースできます。
MD5のようなハッシュ関数とプリイメージ攻撃(単一ブロックのハッシュ文字列を使用して、物事を簡単にする)の場合、暗号化関数の入力と出力のみがあり、キーはありません(これが探しているものです)。
Cody Brociousの答えは正しいものです。厳密に言えば、多くの文字列が同じハッシュにマッピングされるため、ハッシュ関数を「反転」することはできません。ただし、特定のハッシュにマッピングされるone文字列を見つけるか、同じハッシュにマッピングされるtwo文字列(つまりcollision)は、暗号解読者にとって大きなブレークスルーとなります。これら両方の問題の大きな難しさは、優れたハッシュ関数が暗号化に役立つ理由です。
MD5は一意のハッシュ値を作成しません。 MD5の目標は、ソースへのわずかな変更に基づいて大幅に変化する値を迅速に生成することです。
例えば。、
"hello" -> "1ab53"
"Hello" -> "993LB"
"ZR#!RELSIEKF" -> "1ab53"
(明らかにそれは実際のMD5暗号化ではありません)
ほとんどのハッシュ(すべてではないにしても)も一意ではありません。むしろ、それらは一意である十分であるため、衝突はほとんどありえませんが、それでも可能です。
ハッシュアルゴリズムを考える良い方法は、Photoshopで画像のサイズを変更することです... 5000x5000ピクセルの画像があり、それを32x32にサイズ変更するとします。まだ元の画像の表現ですが、はるかに小さく、画像データの特定の部分を効果的に「捨てて」、より小さいサイズに収まるようにしています。したがって、32x32の画像のサイズを5000x5000に戻すと、ぼやけた画像しか得られません。ただし、32x32画像はそれほど大きくないので、まったく同じピクセルを生成するために別の画像を縮小することが理論的に考えられます!
これは単なる例えですが、ハッシュが何をしているのかを理解するのに役立ちます。
ハッシュの衝突は、あなたが考えるよりもはるかに起こりやすいです。 birthday paradox を見て、その理由をより深く理解してください。
可能な入力ファイルの数は128ビット出力の数よりも多いため、MD5ハッシュを可能な各ファイルに一意に割り当てることはできません。
暗号化ハッシュ関数は、データの整合性またはデジタル署名を確認するために使用されます(効率のためにハッシュが署名されます)。したがって、元のドキュメントを変更すると、元のハッシュが変更されたドキュメントと一致しなくなります。
これらの基準は時々使用されます:
これらの基準は、指定されたハッシュに一致するドキュメントを見つけるのを困難にするために選択されます。 (たとえ置き換えが意味のないものであったとしても、元のものを単に置き換えるだけで混乱が生じる可能性があります。)
番号3は番号2を意味します。
特にMD5に関しては、欠陥があることが示されています: MD5と他のハッシュ関数を破る方法 。
中国の科学者は、「選択されたプレフィックスの衝突」と呼ばれる方法を見つけて、2つの異なる文字列間で競合を起こしました。
以下に例を示します。 http://www.win.tue.nl/hashclash/fastcoll_v1.0.0.5.exe.Zip
ソースコード: http://www.win.tue.nl/hashclash/fastcoll_v1.0.0.5_source.Zip
しかし、ここがレインボーテーブルの出番です。基本的には、大量の値が個別にハッシュされ、結果がディスクに保存されます。その場合、反転ビットは、非常に大きなテーブルでルックアップを行うための「ちょうど」です。
明らかに、これは可能なすべての入力値のサブセットに対してのみ実行可能ですが、入力値の境界がわかっている場合は、計算できる可能性があります。
最も多く投票された回答の意味を理解する最善の方法は、MD5アルゴリズムを元に戻すことです。数年前にMD5cryptアルゴリズムを元に戻そうとしましたが、明らかに不可能であるため元のメッセージを復元せず、元のハッシュと同じハッシュを生成するメッセージを生成しようとしました。これは、少なくとも理論的には、元のメッセージを使用する代わりに、生成されたメッセージ(パスワード)を使用して/ etc/passwdファイルにuser:passwordを保存したLinuxデバイスにログインする方法を提供します。両方のメッセージのハッシュが同じになるため、システムは(元のハッシュから生成された)パスワードが有効であると認識します。それはまったく機能しませんでした。数週間後、私が正しく覚えていれば、最初のメッセージでsaltを使用して私を殺しました。有効な初期メッセージだけでなく、塩漬けの有効な初期メッセージを作成する必要がありましたが、これはできませんでした。しかし、この実験から得た知識はナイスでした。
ほとんどの人がすでに述べたように、MD5は可変長データストリームを固定長のデータチャンクにハッシュするように設計されているため、1つのハッシュが多くの入力データストリームで共有されます。
ただし、パスワードのハッシュがあり、元のパスワードを見つける必要がある場合など、チェックサムから元のデータを見つける必要があった場合、多くの場合、ハッシュをグーグル(または任意の検索者)にする方が迅速ですそれを総当たりするよりも答えのために。この方法を使用して、いくつかのパスワードを見つけました。
定義により、Hash(cryptographic Hash)function:可逆的であってはなりません;衝突してはなりません(可能な限り)。
あなたの質問をregd:それは一方向のハッシュです。入力(長さに関係なく)は固定サイズの出力を生成します(algo(MD5の512ビット境界)に基づいてパディングされます)。情報は圧縮(損失)され、実際には逆変換から生成することはできません。
mD5に関する追加情報:衝突に対して脆弱です。最近この記事を読み終えました http://www.win.tue.nl/hashclash/Nostradamus/
暗号ハッシュ実装(MD5およびSHA)のソースコードをMozillaコードで開くことができます。 (freeblライブラリ)。
現在、MD5ハッシュまたはその他のハッシュは、考えられるすべての文字列に対して事前に計算され、簡単にアクセスできるように保存されています。理論上、MD5は可逆的ではありませんが、そのようなデータベースを使用すると、どのテキストが特定のハッシュ値になったかを知ることができます。
たとえば、 http://gdataonline.com/seekhash.php で次のハッシュコードを試して、ハッシュの計算に使用したテキストを確認します
aea23489ce3aa9b6406ebb28e0cda430
f(x)= 1は不可逆的です。ハッシュ関数は元に戻せません。
これは実際に 必須 誰かがハッシュされたデータの破損していないコピーを所有しているかどうかを判断する機能を果たすために。これは、ブルートフォース攻撃の影響を受けやすく、最近では特にMD5に対して非常に強力です。
数学的知識はあるが暗号解読の知識はほとんどない人々の間でも、ここや他の場所で混乱が生じています。いくつかの暗号はXORキーストリームのデータです。したがって、キーストリームを使用できたため、暗号テキストはその長さのすべてのプレーンテキストに対応していると言えます。
ただし、これは、シードpassword
から生成された合理的な平文が、シードWsg5Nm^bkI4EgxUOhpAjTmTjO0F!VkWvysS6EEMsIJiTZcvsh@WI$IH$TYqiWvK!%&Ue&nk55ak%BX%9!NnG%32ftud%YkBO$U6o
によって生成された別のテキストよりもはるかに高いことを無視します。で。
同様に、2つの潜在的なパスワードpassword
とWsg5Nm^bkI4EgxUO
を決定しようとしている場合、一部の数学者が信じているほど難しいことではありません。