web-dev-qa-db-ja.com

MD5ハッシュを復号化することは可能ですか?

誰かが彼にソフトウェアシステムを見たと言った:

  1. 他のシステムからMD5暗号化パスワードを取得します。
  2. 暗号化されたパスワードを復号化して
  3. システム独自のアルゴリズムを使用して、システムのデータベースにパスワードを保存します。

それは可能ですか?私はMD5ハッシュを復号化することは不可能/不可能だと思いました。

私はMD5辞書があることを知っていますが、実際の復号化アルゴリズムはありますか?

240
John Bubriski

いいえ。MD5は暗号化ではありませんが(一部の暗号化アルゴリズムの一部として使用されることはありますが)、一方向の ハッシュ関数 です。元のデータの多くは、実際には変換の一部として「失われ」ます。

これについて考えてみましょう:MD5は常に128ビットの長さです。それは2があることを意味します128 MD5ハッシュの可能性これはかなり大きな数ですが、それでも最も確実に有限です。それでも、与えられたハッシュ関数には無限の数の可能な入力があります(そしてそれらの大部分は128ビット以上、あるいは16バイトを含みます)。そのため、同じ値にハッシュされる可能性のあるデータには、無限の可能性があります。ハッシュを興味深いものにしているのは、同じ値にハッシュされている2つのデータを見つけるのは非常に難しいことです。偶然に起こる可能性はほとんどありません。

(非常に安全でない)ハッシュ関数の単純な例(そしてこれは一方向性であるという一般的な考え方を示しています)は、データのビットのすべてのビットを取り、それを大きな数として扱うことです。次に、大きい(おそらく素数)数nを使用して整数除算を実行し、残りを取ります( Modulus を参照)。あなたは0からnまでの間のいくつかの数を残されるでしょう。まったく同じ文字列を使用して同じ計算を(いつでも、どのコンピュータでも、どこでも)もう一度実行すると、同じ値が表示されます。それでも、nで除算すると、その正確な余りを持つ数は無限にあるため、元の値が何であるかを調べる方法はありません。

とは言っても、MD5にはいくつかの弱点があることがわかっています。複雑な数学では、試してみることなく衝突を見つけることができるかもしれません2。128 可能な入力文字列そして、ほとんどのパスワードは短く、人々はしばしば共通の値( "password"や "secret"のような)を使うということは、ハッシュのためにGooglingや/を使うことで誰かのパスワードを推測できることを意味します。 レインボーテーブル 。ハッシュ化されたときに2つの同一の値が同じ値にハッシュされないように、常に " salt "パスワードをハッシュ化する必要があるのはそのためです。

データがハッシュ関数を通過すると、元に戻ることはできません。

393
Adam Batkin

できない - 理論上。ハッシュの要点はそれが一方通行だということです。これは、誰かがハッシュのリストを取得できたとしても、まだパスワードを取得できないことを意味します。さらに、誰かが複数のサイトで同じパスワードを使用したとしても(そう、私たち全員がそうすべきではないことは知っていますが…)、サイトAのデータベースにアクセスできる人は誰でもそのパスワードを使用できません。サイトB.

MD5がハッシュであるという事実は、それが情報を失うことも意味します。どのようなMD5ハッシュでも、任意の長さのパスワードを許可すると、同じハッシュを生成する複数のパスワードが存在する可能性があります。良いハッシュのためにそれを計算するにはかなり小さい最大長を超えてそれらを見つけることは不可能でしょう、しかしそれはあなたがターゲットハッシュを持っているパスワードを見つけるならギャランティがないことを意味します、それは間違いなく元のパスワードです。それは天文学的にありそうもないあなたが同じMD5ハッシュを持つ2つのASCIIのみの、妥当な長さのパスワードを見ることになるでしょうが、それは不可能ではありません。

MD5はパスワードに使うのが悪いハッシュです:

  • 高速です。つまり、「ターゲット」ハッシュがある場合は、たくさんのパスワードを試して、そのターゲットにハッシュするものを見つけることができるかどうかを確認するのが安価です。 Saltingはthatのシナリオでは役に立ちませんが、のいずれかに一致するパスワードを見つけようとするとより高価になります。複数のを異なる塩を使ってハッシュします。
  • (任意のバイナリデータではなく)印刷可能なテキスト内で衝突を見つけることは少なくとも困難ですが、衝突を見つけやすくする欠陥が知られていると思います。

私はセキュリティの専門家ではないので、「自分の認証システムを使用しない」以外に具体的な推奨事項を提示しません。信頼できる供給元からそれを見つけて、それを使ってください。セキュリティシステムの設計と実装はどちらもトリッキーなビジネスです。

154
Jon Skeet

技術的には「可能」ですが、非常に厳しい条件の下でRainbow tables 、ユーザーのパスワードがそのハッシュデータベースに存在する可能性が非常に低いことに基づくブルートフォース)。

しかし、だからといって

  • 実行可能
    または
  • 安全な

MD5 ハッシュを「リバース」したくない。以下に概説する方法を使用すれば、その必要はありません。 「リバース」MD5は実際にはmaliciousと見なされます-いくつかのWebサイトはMD5ハッシュを「クラック」し、ブルートフォースする機能を提供します-しかし、それらはすべて辞書の単語を含む大規模なデータベースです提出されたパスワードなど。 非常に小さな可能性があり、必要なMD5ハッシュが逆になる可能性があります。そして、あなたが salted MD5ハッシュを持っている場合-これも機能しません! :)


MD5ハッシュshouldを使用したログインの動作方法:

登録中:
ユーザーがパスワードを作成します->パスワードはMD5を使用してハッシュされます->データベースに保存されたハッシュ

ログイン中:
ユーザーはユーザー名とパスワードを入力します->(ユーザー名をチェック)パスワードはMD5を使用してハッシュされます->ハッシュはデータベースに保存されたハッシュと比較されます

「Lost Password」が必要な場合:

2オプション:

  • ユーザーがランダムなパスワードを送信してログインすると、最初のログイン時にパスワードを変更するように仕向けられます。

or

  • パスワードを変更するためのリンクがユーザーに送信され(セキュリティの質問などがある場合は追加チェックが行われます)、新しいパスワードがハッシュされ、データベース内の古いパスワードに置き換えられます
53
Daniel May

直接ではありません。 ピジョンホールの原則 のために、(おそらく)与えられたMD5出力にハッシュする複数の値があります。そのため、確実に元に戻すことはできません。さらに、MD5はanyのような逆ハッシュを見つけるのを困難にするように作られています(しかし 衝突を引き起こす攻撃がありました - そのことつまり、同じ結果にハッシュする2つの値を生成しますが、結果のMD5値がどうなるかを制御することはできません。

ただし、長さがN未満の一般的なパスワードなどに検索スペースを制限すると、元に戻せないプロパティがなくなる可能性があります(MD5出力の数が対象ドメイン内の文字列の数よりはるかに多いため)。それからあなたは Rainbow table あるいは逆ハッシュに似たものを使うことができます。

32
bdonlan

少なくとも合理的な期間内では不可能です。

これがよく処理される方法は、パスワードの「リセット」です。つまり、あなたは彼らに新しい(ランダムな)パスワードを与え、それをEメールで送ります。

13
Matthew Groves

あなたはmd5パスワードを元に戻すことはできません。(どの言語でも)

でも君ならできる:

ユーザーに新しいものを渡します。

いくつかのRainbowテーブルをチェックインして、古いテーブルを取得してください。

12
Nettogrof

いいえ、彼はMD5の辞書について混乱していたに違いありません。

暗号化ハッシュ(MD5など)は 一方通行 ダイジェストだけでは元のメッセージに戻ることはできません ない限り 元のメッセージについての情報が他にもあります。

9
Robert Greiner

復号化(ハッシュ値からプレーンテキストをアルゴリズム的に直接取得する)、いいえ。

ただし、 Rainbow table として知られているものを使用するメソッドがあります。あなたのパスワードがソルトなしでハッシュされればそれはかなり実行可能です。

8
Sinan Taifour

MD5はハッシュアルゴリズムです。ハッシュ値を元に戻すことはできません。

ユーザーが別のパスワードを入力してハッシュを計算し、それを新しいパスワードとして保存する「パスワード変更機能」を追加する必要があります。

7

簡単な方法はありません。これは、最初にパスワードをハッシュするポイントの一種です。 :)

あなたがすべきできることの1つは、それらに一時的なパスワードを手動で設定し、それを送信することです。

これは悪い考えである(とにかく動作することは保証されない)ので、これに言及するのをためらいますが、古いパスワードを回復できるかどうかを確認するために milw0rm のようなRainbowテーブルでハッシュを調べることができますそのように。

7
Bill the Lizard

どのようにそしてなぜそれが可逆的でないのか、そしてなぜあなたがとにかくしたくないのかについての他のすべての答えをここで見てください。

しかし完全を期すために、 レインボーテーブル があり、それを使って可能な一致を調べることができます。 Rainbowテーブルの答えがあなたのユーザーが選んだオリジナルのパスワードになるという保証はありません。

また、これは塩味のハッシュに対しては機能しません。 Salting は多くのセキュリティ専門家によって推奨されています。

6
Dinah

逆関数を見つけるという点でハッシュ関数を「元に戻す」方法はありません。前述したように、これがハッシュ関数を持つことの全体的なポイントです。それは可逆的であるべきではなく、それは速いハッシュ値計算を可能にするべきです。そのため、与えられたハッシュ値を生成する入力文字列を見つける唯一の方法は、考えられるすべての組み合わせを試すことです。そのため、これを総当たり攻撃と呼びます。

考えられるすべての組み合わせを試すには非常に時間がかかります。これが、ハッシュ値を使用してパスワードを比較的安全な方法で保存する理由でもあります。攻撃者がすべてのユーザーパスワードを入力してデータベースにアクセスできる場合、いずれにせよあなたは失います。ハッシュ値と(理想的には)強力なパスワードがある場合、攻撃者にとってハッシュ値からパスワードを取り出すのははるかに困難になります。

ハッシュ値の計算は比較的高速であるため、ハッシュ値を格納してもパフォーマンス上の問題はありません。そのため、ほとんどのシステムが実行するのは、ユーザーが入力したパスワードのハッシュ値(高速)を計算し、それをユーザーデータベースに格納されているハッシュ値と比較することです。

4
Kage

MD5は、ハッシュから元のコンテンツを取り戻すことができるという理由ではなく、壊れていると見なされますが、仕事をすれば、同じハッシュにハッシュする2つのメッセージを作成することができるためです。

MD5ハッシュのハッシュを解除することはできません。

3
Ned Batchelder

はい、まさにあなたが求めていることが可能です。 MD5パスワードを助けなしに「復号化」することは不可能ですが、MD5パスワードを別のアルゴリズムに再暗号化することは可能です。

あなたがすることはあなたのユーザーが古いMD5パスワードを使ってあなたの新しいシステムにログオンできるように手配することです。彼らがログインした時点で、彼らはあなたのログインプログラムにあなたが証明したパスワードのハッシュされていないバージョンを与えました。その後、このハッシュされていないパスワードを新しいハッシュアルゴリズムに変換できます。

明らかに、これは拡張されたプロセスです。ユーザーがパスワードを教えてくれるのを待つ必要があるからですが、うまくいきます。

(注:7年後、誰かが役に立つと思う人もいるでしょう)

2
user3710044

元のメッセージを取得するために辞書を使用するオンラインツールを見つけることができます。

場合によっては、辞書の方法は役に立たないかもしれません。

  • メッセージがSALTメッセージを使用してハッシュされている場合
  • メッセージが複数回ハッシュされている場合

たとえば、これが1つの MD5復号器 オンラインツールです。

2
davitz38

ただし、解決できるのは、(パスワードがハッシュされているだけで、再生攻撃を防ぐためのソルトを追加せずにソルトを知っている必要がある場合)、辞書攻撃ツールを入手することだけです。 、多くの単語、数字などのファイルは、2行を作成します。1行はWord、number(辞書)、もう1行はWordのハッシュです。一致する場合はハッシュを比較します。

暗号解読を行わずに、それが唯一の方法です。

2
berkay

いいえ、できません。辞書を使うことも、求めているハッシュが得られるまでさまざまな値をハッシュすることもできます。しかし、それを「復号化」することはできません。

1
Vilx-

MD5には弱点があるので( Wikipedia を参照)、ハッシュを事前計算しようとするプロジェクトがいくつかあります。ウィキペディアは、これらのプロジェクトのいくつかについてもヒントを示しています。私が知っている(そして尊敬する)のは、オフラックです。ユーザーに自分のパスワードを知らせることはできませんが、機能するパスワードをユーザーに知らせることはできます。しかし、私は思う:彼らが忘れてしまった場合に備えて、新しいパスワードを使ってメールするだけです。

1
dz.

いいえ、MD5などのハッシュ関数を逆にすることはできません。出力ハッシュ値を考えると、入力メッセージに関する十分な情報がわからない限り、入力メッセージを見つけることはできません。

復号化は、ハッシュ関数用に定義された関数ではありません。暗号化と復号化は、CBCモードのAESなどの cipher の機能です。ハッシュ関数は encrypt decrypt も暗号化しません。 ハッシュ関数はdigest入力メッセージに使用されます。名前が示すように、逆アルゴリズムは不可能です by design


MD5は、暗号的に安全なone-wayハッシュ関数として設計されています。入力メッセージの大部分が事前に決定されている場合でも、MD5の衝突を簡単に生成できるようになりました。そのため、MD5は公式に壊れており、MD5を暗号的に安全なハッシュと見なすべきではありません。ただし、ハッシュ値につながる入力メッセージを見つけることはまだ不可能です:H(X)のみがわかっているときにXを見つけます(Xには少なくとも1つの128事前計算済みデータのバイトブロック)。 既知のプリイメージ攻撃はありません MD5に対してです。

通常、ブルートフォース攻撃または(拡張)辞書攻撃を使用してパスワードを推測したり、データベースを比較したり、いわゆるRainbowテーブルでパスワードハッシュを検索したりすることもできます。一致が見つかった場合、入力が見つかったことは計算上確実です。ハッシュ関数は衝突攻撃に対しても安全です:X'を見つけることで、H(X') = H(X)H(X)になります。そのため、Xが見つかった場合、それが実際に入力メッセージであることが計算的に確実になります。そうでなければ、結局衝突攻撃を実行することになります。レインボーテーブルは攻撃を高速化するために使用でき、特定のハッシュが与えられたパスワードを見つけるのに役立つ専用のインターネットリソースがあります。

もちろん、ハッシュ値H(X)を再利用して、他のシステムで生成されたパスワードを検証することもできます。受信システムがしなければならない唯一のことは、入力としてH(X)を取る決定的関数Fの結果を保存することです。 Xがシステムに与えられると、H(X)、したがってFが再計算され、結果を比較できます。言い換えれば、パスワードが正しいことを verify にハッシュ値を解読することは not required です。異なる値としてハッシュします。


MD5の代わりに、パスワードハッシュまたはPBKDF(パスワードベースのキー派生関数)を使用することが重要です。このような関数は、saltをハッシュと一緒に使用する方法を指定します。これにより、同じパスワードに対して(他のユーザーまたは他のデータベース内から)同じハッシュが生成されなくなります。そのため、パスワードハッシュは、ソルトが十分に大きく、適切にランダム化されている限り、Rainbowテーブルの使用を許可しません。

パスワードハッシュには、work factor iteration count を使用して構成されている場合もあります)が含まれています。値。これは、ソルトとハッシュ値を持つデータベースが盗まれる可能性があるため重要です。最後に、パスワードハッシュはmemory-hardである場合もあるため、ハッシュを計算するにはかなりの量のメモリが必要です。これにより、特殊なハードウェア(GPU、ASIC、FPGAなど)を使用して、攻撃者が検索を高速化することができなくなります。ペッパーや並列化の量など、他の入力または構成オプションもパスワードハッシュに使用できます。

ただし、H(X)がパスワードハッシュであっても、H(X)で指定されたパスワードを誰でも検証できます。パスワードハッシュは依然として決定論的であるため、誰かがすべての入力とハッシュアルゴリズム自体を知っている場合、Xを使用してH(X)を計算でき、また-結果を比較できます。

一般的に使用されるパスワードハッシュは、bcryptscrypt、およびPBKDF2です。また、さまざまな形式でArgon2があり、最近のパスワードハッシュ競合の勝者です。 ここではCrackStation は、パスワードセキュリティ権限の実行に関する優れたブログ投稿です。


攻撃者がハッシュ計算を実行できないようにして、パスワードが正しいことを確認することができます。このため、パスワードハッシュへの入力として胡pepperを使用できます。あるいは、AESなどの暗号とCBCやGCMなどの動作モードを使用して、ハッシュ値をもちろん暗号化することもできます。ただし、これには、シークレット/ key を個別に保存し、パスワードハッシュよりも高いアクセス要件が必要です。

1
Maarten Bodewes

MD5ハッシュアルゴリズムは元に戻すことができないため、MD5デコードは不可能ですが、Webサイトによってはパスワードの大部分が一致するため、MD5ハッシュのデコードをオンラインで試すことができます。

オンラインで試す:

MD5復号化

md5online

md5decrypter

1
Girish Patidar

理論的にはハッシュ値を復号化することは不可能ですが、元のプレーンテキストを元に戻すための汚いテクニックがいくつかあります。

  1. 総当たり:すべてのコンピューターセキュリティーアルゴリズムは、総当たり 総当たり を受けます。この考えに基づいて、今日のGPUは並列プログラミングの考えを採用しています。それを使用すると、グラフィックプロセッサを使用して大まかにブルートフォースすることでプレーンテキストを取り戻すことができます。このツール hashcat はこの仕事をします。前回 cuda バージョンをチェックしたとき、6分以内に7文字の長さの文字をブルートフォースすることができました。
  2. インターネット検索:ハッシュをコピーしてGoogleに貼り付けて、対応する平文がそこにあるかどうかを確認してください。あなたが何かをpentestingしているときこれは解決策ではありませんが、それは間違いなく試してみる価値があります。一部のWebサイトでは、辞書内のほとんどすべての単語のハッシュが保持されています。
1
vikkyhacks

MD5は暗号(一方向)ハッシュ関数なので、直接デコードする方法はありません。暗号化ハッシュ関数の目的は、元に戻せないことです。

できることの1つは、ハッシュされたものを推測してから同じ関数でハッシュし、一致するかどうかを確認するというブルートフォース戦略です。ハッシュされたデータを推測するのが非常に簡単でない限り、それは長い時間がかかるかもしれません。

0
Ajanyan Pradeep