web-dev-qa-db-ja.com

MD5ハッシュを「復号化」することはどうして不可能ですか?

可能性のある複製:
MD5ハッシュ値を元に戻せないのはなぜですか?

私はMD5についての質問を読んでいて、それが私を驚かせた何かを思い出させました。非常に簡単な質問です。よくない質問で申し訳ありません。なんらかのアルゴリズムを使用して何かを1つのものに変換する方法が理解できず、アルゴリズムを逆に使用して元に戻す方法がありません。

では、これはどのようにして可能でしょうか?

また、複数の文字列が同じMD5ハッシュを作成できるため、入力文字列よりもデータが少ないため、他のハッシュシステムの方が優れているでしょうか。

43
Rob

基本的には、MD5の出力に含まれる情報が入力よりも少ないためです。これが基本的にハッシュアルゴリズムと暗号化アルゴリズムを区別するものです。

これが簡単な例です。10桁の数値のハッシュを計算するアルゴリズムを想像してみてください。アルゴリズムは「最後の2桁を返す」です。 8023798734のハッシュを取得すると34になりますが、ハッシュアルゴリズムが8桁の情報を破棄したため、元の数値が何であるかを知る方法がありません。これはMD5と似ていますが、ハッシュがデータの一部を切り捨てるのではなく、複雑な手順で計算される点が異なります。

では、どのようにして1つのハッシュが他のハッシュよりも優れているのでしょうか。まず、異なるハッシュアルゴリズムはcollisionsに対して多少の耐性があります(2つの入力が同じ出力を生成する場合)。衝突の確率は、可能なハッシュ出力の数に反比例します。衝突はハッシュの望ましくない機能です。データが変更された場合、ハッシュも変更する必要があるため、より良いハッシュアルゴリズムを取得する1つの方法は、より多くの可能な出力を持つハッシュを使用することです。上記の数字の例では、最後の2桁ではなく最後の4桁を使用すると、特定のハッシュとの衝突の確率が低下します(技術的にはpreimageと呼ばれます)。 )100に1の代わりに10000に1にするため、どのようなセットでも、10桁のすべての数値でハッシュ値が異なる可能性が高くなります。

暗号化のセキュリティの問題もあります。一部のデータが改ざんされていないことを確認するためにハッシュを使用したい場合、改ざんを行っている人が、どの入力が特定の出力を生成するかを予測できないことが望ましいです。可能であれば、出力(ハッシュ)が同じになるように入力データを変更できます。数字の例に戻って、番号1879483129をメールで送信するとします。この番号が変更されずに届くのは非常に重要です 。電話をかけて、番号のハッシュ(29)を教えてくれるかもしれませんが、「最後の2桁」のアルゴリズムは暗号的に安全ではないため、悪意のあるハッカーが途中で番号を5555555529に変更すると、違いがわかりません。

MD5は暗号的に安全ではありません (そして SHA-1も危険にさらされています )であることが示されています。つまり、特定の出力に対応するさまざまな入力を見つけることが可能です。それはまだランダムビットフリップなどから保護するための優れたアルゴリズムですが、誰かが意図的にデータを破損したい可能性がある場合は、SHA-256以上など、より安全なものを使用する必要があります としてHMACスキームの一部

104
David Z

アルゴリズムを使用して何かを1つのものに変換する方法が理解できず、アルゴリズムを逆に使用して元に戻す方法がありません。

牛をハンバーガーにすることはできますが、ハンバーガーを牛にすることはできません。

変換により、存在するデータが破壊されて減少し、データを回復できなくなります。

83
Tangurena

これがパラレルです:

家族全員の年齢を合計します。下2桁のみを保持します。

では、その1つの数字に基づいて、みんなの年齢を教えてください。

17
Joe

これについて考える:

「12345678」という数値文字列があります。

私はハッシュアルゴリズムを持っています、それはすべての単一の数値の合計を返すだけです、それをf()と呼びましょう

したがって、f( "12345678")= 1 + 2+ .. + 8 = 36。

次に質問:

既知のf(x) = 36、xの元の値を取得することは可能ですか?

f()はアルゴリズムであり、情報が失われるため、できません。

MD5はf()のようなハッシュアルゴリズムですが、はるかに複雑です。

4
Colin Niu

ここに簡単な答えがあります...

ハッシュ値の数には限りがあり、ハッシュ可能なプレーンテキスト値の数には限りがあります。

したがって、特定のMD5ハッシュを逆にすると、無限の数のプレーンテキスト値が生成されます。

2
Dolph

あなたの質問の2番目の部分への回答(最初の部分への回答は上記の他の人から十分に与えられている):MD5は、暗号に対する攻撃の証拠(つまり、プレーンで行うことができる変更)のために弱いと見なされます-MD5サムに変化をもたらさないテキスト)。他のハッシュ手法は、本質的に任意のハッシュコリジョンの影響を受けにくい場合があります(少なくとも、このような任意のコリジョンは、まだ、SHA-2のハッシュセットなどで可能であるとは示されていません)。したがって、攻撃者はMD5以外の手法でハッシュされたハッシュを複製できる可能性は低くなります(もちろん、理論的には、ハッシュ衝突攻撃はすべてのハッシュ関数に対して可能です。これが当てはまらない場合、ハッシュ関数として成功しません。問題は攻撃者が「正しい」平文(つまり、同じハッシュ値にハッシュする平文)を「偽造」することにどれほど簡単に成功できるか)。

ちなみに、プレーンテキストのMD5サムは、「少ない」データが含まれている、または「損失がある」ため、必ずしも安全であるとは限りませんが、任意のプレーンテキストから固定範囲内で合計値を計算します(プレーンテキスト<128ビットの場合、実際、MD5の合計には平文よりも多くの情報が含まれています...)。したがって、(理論的には無限の)平文の数はすべて同じMD5ハッシュに合わせることができます。

2
ig0774

うーん、失礼なことではありませんが、「入ってくるよりも出てくる情報が少ない」という答えはすべて要点を逃しているようです。

MD5および類似の暗号化ハッシュコードの主な用途は、パスワードの暗号化です。その場合、元の文字列を再構築できるかどうかは気にしません。私が気にするのは、同じ値にハッシュされる文字列を作成できるかどうかだけです。

単純化した例を見てみましょう。ハッシュアルゴリズムが「最後の2桁を取る」であったとします。したがって、私のパスワードが「12345678」の場合、ハッシュコードは「78」です。 「78」から「12345678」に戻る方法はありますか?いいえ。でも、パスワードをハッキングしているのであれば、元のパスワードが何であるかを知っていてもかまいません。パスワードを入力するだけでいいので、これがアルゴリズムであることがわかっていれば、パスワード「99978」を使用します。それは「78」にハッシュするので、パスワード検証アルゴリズムはそれを通過し、私は入っています。

明らかに、MD5は、この「正しい値にハッシュされるもの」という意味でも、「最後の2桁を取る」などの単純なアルゴリズムでさえ、リバースするのがはるかに困難です。しかし、それは文字通り不可能ですか?それも私を困惑させます。確かに、情報は途中で破棄されます。しかし、情報が破棄される任意の時点でランダムな値を入力して、「任意」の値に戻すことはできませんか? MD5の実際のアルゴリズムは確認していません。私はそれを逆にするのが簡単なものではないと思います、例えばすべてのプラスをマイヌに変更するかそのような些細な何か、または誰かがずっと前にそれをしたでしょう。これを解読しようとしたハッカーが何百万人もいるという事実から、たとえそれが理論的には可能であったとしても、信じられないほど難しいはずです。

2
Jay

また、複数の文字列が同じMD5ハッシュを作成できるため、入力文字列よりもデータが少ないため、他のハッシュシステムの方が優れているでしょうか。

MD5に対する攻撃が知られています。これにより、攻撃者はdifferentコンテンツでsame MD5ハッシュを使用して複数のドキュメントを作成できます。この攻撃は計算上実行可能であり、デモとして、大統領選挙の結果を「予測」するために使用されました。 (攻撃者は選挙の前にハッシュを公開し、その後、そのハッシュが勝者の名前を示す文書を公開しました。しかし、実際には、攻撃者はすべて同じ候補者の文書を持っています。)

より良いシステムは、同じ値にハッシュする2つの異なるドキュメントを作成するのが計算上扱いにくいという暗号の保証を提供します。 SHA-1はそのようなシステムかもしれません。

さらに悪いシステムでは、任意のハッシュへのアクセスが与えられた場合に、そのハッシュを使用してドキュメントを作成できる攻撃が可能になります。多くのハードウェアシステム(イーサネットを含む)で現在も使用されている由緒あるCRCシステムは、この攻撃に対して脆弱です。 MD5と同様に、出力は入力から再構築できないハッシュ関数ですが、出力が与えられた場合、与えられたCRC-32またはCRC-64署名でドキュメントを構築することは簡単です。さらに悪いことに、そのようなドキュメントに好きなテキストを入れて、最後にジャンクを追加するだけで必要なCRCを取得できます。

CRC-32が非常に高速に計算され、MD5が大幅に長くなり、SHA-1がそれよりもやや長くなるのは偶然ではありません。コストモデルと信頼モデルはどちらも困難です。

本当に優れたハッシュ関数は、CRCと同じくらい速く計算され、SHA-1と同じ値にハッシュする2つのドキュメントを構築するのが難しいでしょう。息を止めないで...

1
Norman Ramsey

次の関数について考えてみましょう:f(x) = xx。ここで、f(x)= 25を知っているとすると、xは何ですか?答えは5または答えは-5の可能性があります。fのドメインの複数の要素がfの下の値にマップするようなfの範囲に値が存在するため、fへの入力を復元できません。 、関数fは可逆ではありません。MD5にも同じ概念が適用されます。MD5アルゴリズムには複数の入力があり、入力が異なっていても、結果として同じハッシュ値が生成されます。つまり、MD5アルゴリズムは、 f(x)= xxは1対1ではないため、可逆関数ではありません。

ただし、これはMD5への入力を回復できないという意味ではありません。これは単に、MD5への入力を100%確実に復元できないことを意味します。これをより具体的にするために、関数f(x)= x * xをもう一度見てみましょう。ここで、fへの特定の入力について、それが正である確率は99%であると言ったらどうでしょうか。その場合、25のハッシュは-5ではなく5の値から取得されたと非常によく推測できます。これは実際、人々がハッシュ関数を破壊する方法です(MD5を含む、つまり、非常に優れた暗号化ハッシュ関数ではありません)。パスワードに関しては、他のパスワードよりもはるかに頻繁に使用される特定のパスワードがあります。あなたがする必要があるのは、それらのパスワードのMD5を取り、それをハッシュと比較することだけです。それらが一致する場合、そのパスワードからのものであるとはかなり合理的な推測です。

one-to-one functionsInjective functionscryptographic hash functionsMD5 についてもご覧ください。 =、 SHA1 、および Benlogセキュリティブログの秘密をハッシュしない

また、複数の文字列が同じMD5ハッシュを作成できるため、入力文字列よりもデータが少ないため、他のハッシュシステムの方が優れているでしょうか。

同じハッシュを持つ複数の(無限に多くの)メッセージが存在する必要があることは事実ですが、暗号化ハッシュの目的は、そのような衝突を検出できないようにすることです。

ランダムなメッセージのハッシュを計算して、最終的に同じ結果が2回得られるまで、衝突を見つけることができると考えているかもしれません。ただし、可能なハッシュ値のスペースのサイズを過小評価しているはずです。

MD5の場合、ハッシュのサイズは128ビットです。 128ビットのスペースは、言い換えればダグラスアダムスです。本当に大きい。あなたは、それがどれほど巨大に途方もなく大きいか信じられないでしょう。可能なハッシュの数は2です128、または3.40282367×1038。 34の後に37のゼロが続きます! 1秒間に1兆個まで数えることができたとしても、128ビットの数をすべて数えるには100億千年かかります。

ただし、MD5などの一部のハッシュアルゴリズムには、攻撃者がブルートフォース攻撃に比べてはるかに少ない労力でそれを元に戻す(つまり、特定のハッシュを持つメッセージを見つける)ことができる弱点があります。 MD5はこの点で完全に壊れていると考えられています。

1
Wim Coenen

基本的に、含まれるビット操作は、それを元に戻すことが技術的に不可能であることを意味します。出力のセットを構築するには、非常に複雑な時間と巨大なメモリの複雑さが必要になります。それはまったく不可能ではありませんが、必ずしもそうである必要はありません。最高のスーパーコンピュータの能力を1マイルも超えていないだけです。

0
Puppy

ほとんどの答えは質問の真のポイントには当てはまりません:ハッシュ変換は非線形なので、逆にするのは非常に困難です(ただし、十分な計算能力と時間を考えると不可能ではありません)。

数を二乗して平方根を取得することの相対的な難しさについて考えてください。さらに、部分的な情報しかなく、欠落しているすべてのビットは正しい答えを出すために重要です(数値のトリミングの例とは異なります)。

それでも確信が持てない場合は、MD5またはその他の暗号化ハッシュ関数の手順を逆に自分で試してみてください;-)

0
fortran

ハッシュ処理中に一部の情報が失われるため、文字列のエントロピーが増加します。これは、元の文字列を再構築するのに十分な情報がないことを意味します。

0
Alf Eaton