web-dev-qa-db-ja.com

すべてのハッシュ値には逆の値がありますか?

Md5、shaなど、さまざまなハッシュ関数があります。これらは値Vを取り、変換Function(V) = Hを介してHを生成します。ここで、Functionはmd5、shaなどです。

私の質問は:すべてのハッシュ値Hには値Vがありますか?

たとえば、md5ハッシュ値f2c057ed1807c5e4227737e32cdb8669(完全にランダム)、それがどこから来たかを見つけることができますか?

つまり、すべてのハッシュをリストすると、

00000000000000000000000000000000
00000000000000000000000000000001
...
fffffffffffffffffffffffffffffffe
ffffffffffffffffffffffffffffffff

それらのそれぞれの値を見つけることができますか?

編集(OPのコメントから):考えられる出力ごとに入力が存在するかどうかを知りたい。私は逆を見つけることに興味がありません

34
bodacydo

これらは実際、人々がハッシュ関数について尋ねる非常に一般的な質問です。私はあなたがグーグルであなたを助けるためにいくつかの用語を含めて、より数学的な答えを与えます。

私の質問は:すべてのハッシュ値Hには値Vがありますか?

この質問の数学的方法は次のとおりです。

ハッシュ関数H = Function(V)の場合、すべての出力Hには、それにマップするプリイメージVがありますか?

よりコンパクトに

ハッシュ関数はFunction()全射ですか?

MD5SHA-1SHA-256SHA-3などが形容詞であるかどうかは良い質問であり、インターネットで何度も尋ねられる質問です(Googleでは良い議論)。短い答えは:わからない。私たちはそれらがそうであると強く疑っていますが、これは数学的にも実験によっても証明できたものではありません。

なぜこれが難しい質問なのかを説明します。 CS.seのこの回答MD5について話し、ハッシュ関数はランダムに非常に近く、パターンを回避するように設計されているため、あらゆる種類の数学的分析が非常に困難になることを指摘しています。可能なすべての出力を確認するまで、入力を推測するプログラムをいつでも作成できます。 MD5には128-bit出力があり、2128 あなたがヒットする必要があるハッシュ。最初の試行でそれらすべてを取得し、1秒あたり1つをチェックできると仮定すると、約 1031 年 および少なくとも 1028 ハードドライブ容量のgb 徹底的なチェックを実行します(ユニバースは約10と推定されることに注意してください)10 歳、そして地球上の総ハードドライブ容量は約10です12 gb)。

SHAファミリーのハッシュ関数は、出力スペースが大きく、数学的に複雑です。つまり、この種の分析は、それらにとって扱いにくいものです。

また、ハッシュ関数は任意のサイズの入力を受け取り、固定サイズの出力を提供するため、(理論的には)任意のハッシュにマッピングされる入力が無限に存在する可能性があります。そのため、ハッシュ値Hには、それにマップする大きな値のセット{V1, V2, ...}が含まれている可能性があります。


質問の2番目の部分について:

md5ハッシュ値f2c057ed1807c5e4227737e32cdb8669(完全にランダム)を指定すると、[それを生成する入力のセット]を見つけることができますか?

特定のハッシュを生成する文字列を見つけることは、 Preimage Attack と呼ばれる暗号解読の形式です。他の人が指摘したように、ハッシュ関数が Cryptographic Hash Function と見なされるためには、プリイメージ攻撃に耐性がある必要があります-つまり、すべてのリストを取得する以外に反転することは不可能でなければなりません可能な文字列、それらをハッシュし、それらが一致するかどうかを確認します。

可能性のあるすべての文字列をチェックするよりも速くハッシュを反転するショートカットを誰かが見つけた場合、これはそのハッシュ関数の脆弱性と見なされ、そのハッシュ関数は「壊れている」と見なされます。 MD5は壊れていると見なされており、暗号化での使用は推奨されていないため、これに対する既知のプリイメージ攻撃を見つけることができる場合があります。それらを調べれば、MD5ハッシュを逆転させるのに役立つツールを見つけることができるかもしれません。ハッシュのSHAファミリはまだ壊れていないので、あなたはそれらの幸運を失っています。

15
Mike Ounsworth

これが一方向ハッシュ(つまり、md5、sha1、sha2など)の目的です。それらはリバーシブルであるべきではありません。ハッシュを元に戻すことができれば、多くのセキュリティがすぐに安全でなくなります。ハッシュには、ハッシュ元の情報は含まれていません。ハッシュのプロセスは一方向では簡単で、反対方向では本当に本当に難しいのが理由です。

大量のコンテンツがあり、それをハッシュしてから、そのコンテンツをハッシュとともに大きなハッシュマップに保存した場合、ハッシュで検索することですばやく逆にして、そのハッシュを生成したコンテンツを見つけることができます。これは、レインボーテーブルと呼ばれるもので、これまではパスワードを解読するための実行可能な方法でしたが、それほど多くはありません。

可能であれば、これを検討してください。たとえば、100MBの映画のMD5ハッシュを作成したとします。このハッシュ値を逆にして100MBの映画を取得できれば、非常に強力な圧縮アルゴリズムが得られます。それは、1Mb、100MB、1Gb、1Tbなどのコンテンツを取得し、それを32バイトのハッシュに変換して、私が望むものを表すことができることを意味するからです。これで、32バイトの任意のサイズで考えられるすべてのコンテンツを本当に表すことができますか? 32バイトの情報密度が不足しているため、2 ^ 128 = 340,282,366,920,938,463,463,374,607,431,768,211,456と想像できるすべてのコンテンツを表すことができないため、これは不可能です。それも私が作成できるユニークなコンテンツの上限です。

この答えは、数学がこれをどのようにして不可能にするか(または少なくとも非常に難しい)について、私よりもよく説明していると思います。

ハッシュ関数が一方向なのはなぜですか?アルゴリズムを知っているのに、なぜアルゴリズムから入力を計算できないのですか?

2
chubbsondubs

暗号化ハッシュについて話している場合、「H」ハッシュの生成に使用された「V」値を復元する方法はありません。それらはそれを防ぐ方法で設計されています。

元の「V」値を見つけるために人々が行うことは、さまざまな「V」を生成し、それぞれの「H」を計算し、これらの「H」を比較して、どれが元の「H」ハッシュに等しいかを確認することです。ええ、それをブルートフォースするだけで。

1
DarkLighting