web-dev-qa-db-ja.com

MD5衝突はなぜ危険なのですか?

MD5アルゴリズムは衝突耐性がないこと、および任意サイズのデータ​​間の衝突はブルートフォースよりも効率的な方法で見つけることができることを理解しています。

ただし、ハッシュアルゴリズムをリバースエンジニアリングする方法が見つからないため、MD5はパスワードハッシュなどの安全なアルゴリズムであることを確認しました。

ハッカーがセキュリティのためにMD5を使用していたウェブページやその他の安全なクライアントを悪用できるのはどのような場合ですか?

4
Jared Nielsen

システムに侵入してハッシュ化されたパスワードファイルをダウンロードすると、うまくいくパスワードを見つけるのが困難になります。

MD5ハッシュの出力を元のテキストに変換することはできませんでした。悪いニュースは、MD5はCPU時間をあまり消費しないことです。

「ちょっと待って、それは悪いニュースですか?」実はそうです。ハッシュ値を計算するとき、CPU時間を少なくするのではなく、より多く取る必要があります。悪意のあるユーザーが何百万、何十億ものパスワードをより速くテストできるほど、秘密を守ろうとしているパスワードにすばやく到達できます。

500万の9文字のパスワードのテストを実行し、私のマシンで次の結果を得ました(opensslを使用すると、結果はミリ秒になります)。

  • MD5:2449
  • SHA1:2620
  • SHA256:3884

考えられる6文字のパスワードのほぼすべてをカバーする約50億のパスワードをテストする場合、CPU時間はMD5の約28日からSHA256の44日までの範囲になります。これは、それほど高速ではないコンピュータのシングルスレッドで発生します。彼らが6ダースのグラフィックカードに数百ドルを投資した場合、これは数時間で完了する可能性があります。

ハッシュプロセスでは、ハッシュを複数回計算するのが一般的です。パスワード「abc123」のハッシュを計算して「8be8efb0bfa…」を取得します。その後、ハッシュのハッシュを計算すると、「98dead38ed2…」を取得します。これを10回または100回実行すると、時間の違いにほとんど気づかないでしょうが、悪者は数時間ではなく、数日または数ヶ月かかる必要があります。

忘れないでください。検索する必要があるのは、パスワードテーブルに格納されている値にハッシュする文字列だけです。元の値とは限りません。どんな衝突もします。このブルートフォース攻撃よりも簡単な衝突を見つけるためにハッシュ自体を攻撃する方法があります。それだけの価値があるのか​​と思いますが、同じ値にハッシュされる印刷可能な文字列のペアが非常に多いとは思いません。

これがあなたの質問に正確に答えるかはわかりませんが、関連があるようです。

3
Bob Bryan

ユーザーがサーバーごとに既知の独自の秘密鍵を持っているセキュリティシステムについて考えます。コマンドをサーバーに送信するとき、コマンドと秘密鍵をハッシュしてから、コマンドにハッシュを送信します。サーバーは同じハッシュを行い、コマンドが秘密鍵でハッシュされたことを確認します。これは 基本的にはOAuthが行うこと (SHA-1を使用する場合を除く)です。

攻撃者が秘密鍵なしでハッシュを生成できる場合、攻撃者はあなたの鍵にアクセスすることなく、コマンドをあなたとして送信できます。

同様のケースは、ハッシュ関数を使用してデータを検証するときにも発生します。コンピュータ上に既知の優れたプログラムのデータベースがあり、データベースにないプログラムの実行を拒否することができます。攻撃者が衝突を引き起こす可能性がある場合、プログラムは悪意を持ってプログラムを変更できますが、変更されていないかのようにデータベースに表示されます。これは基本的に Flameマルウェア が行ったことです:

Flameは、Microsoft Enforced Licensing Intermediate PCA認証局からの詐欺的な証明書で署名されました。マルウェアの作成者は、誤ってコード署名が有効になっていて、弱いMD5ハッシュアルゴリズムをまだ使用しているMicrosoft Terminal Server Licensing Service証明書を特定し、マルウェアの一部のコンポーネントに署名してそれらを表示させるために使用した証明書の偽造コピーを作成しましたマイクロソフトを起源としています。

これがパスワードハッシュの問題ではない理由は2つあります。

  • パスワードのハッシュに通常の暗号化ハッシュ関数(MD5、SHA- *など)を使用すると、いずれにしても完全に機能しなくなります。パスワードをブルートフォースにできるのに、なぜわざわざハッシュ関数を壊してしまうのでしょうか。パスワードハッシュを正しく行う(PBKDF2)場合は、内部ハッシュ関数がMD5であっても脆弱ではありません(saltと多数の反復により、これがさらに困難になると思います)。

  • パスワードハッシュの衝突を見つける意味はほとんどありません。サーバープログラム(MD5がパスワードハッシュ関数であると考えている馬鹿者によって作成されたもの)が巨大なバイナリパスワードを窒息させないと仮定すれば、誰かとしてログインできると思います。また、ハッシュにアクセスできる場合は、おそらくサーバーにすでにアクセスしています。

2
Brendan Long

パスワードのハッシュとして使用するような状況(必要なのは従来のコンピューターに対するプリイメージの耐性のみ)の場合、実際のMD5は基本的にSHA-1およびSHA-2ハッシュ(SHA-256、SHA-512)と同じくらい優れています。 MD5に対する最高の公開された攻撃は、2からその複雑さによるプレイメージ耐性を減らすだけです。128 24倍(2123.4)、これは完全に安全です。

大規模な汎用量子コンピューターが開発された場合、MD5に対するブルートフォースのプリイメージ攻撃は、おおよそのsqrt(2128)= 264。量子コンピューターの脅威に対して、より大きなハッシュを使用することが推奨されています。 SHA-256(プリイメージ耐性用)またはSHA-512(sqrt(2128)量子攻撃者の場合)。

はい、MD5はSHA-1およびSHA-2ファミリよりもわずかに高速です。これは、ハッシュ関数には適していません。しかし、その違いはおおよそ2の因数であり、ごくわずかです。また、単純な暗号化ハッシュ関数は現代の目的には速すぎるため、計算が簡単な辞書攻撃を防ぐために MD5-crypt (および一意のソルト)のような多くの反復ラウンドを実行する必要があります。

しかし、結論としては、セキュリティを重視する開発者は、衝突への耐性が必要な場合にMD5を回避する必要があるということです。部分的に正当化された理由のために、彼らはしばしば、プリイメージ耐性だけが必要とされるドメインでさえMD5を避けることに決めました。多分彼らは、MD5に対する衝突攻撃について聞いたことがあり、プリイメージ攻撃と衝突攻撃の微妙な違いを理解していない他の人からの批判に直面したくありません。システムがプリイメージ耐性のみを必要とすること、および巧妙な攻撃者がMD5ハッシュに対する衝突攻撃を使用してシステムを悪用することはできないと、彼らは完全に納得していないのかもしれません。あるいは、MD5には衝突耐性がないため、MD5は本質的に他のものよりも弱く、SHA-1/SHA-2ハッシュ関数が壊れる前に、プリイメージ攻撃に対して完全に壊れる可能性が高いと感じているかもしれません。

1
dr jimbob