web-dev-qa-db-ja.com

MD5を使用して小さなファイル(15kb未満)の整合性を検証することは安全ですか?

MD5の衝突は90年代以降に文書化されており、MD5に基づくデジタル証明書は2010年に完全に侵害されたことが証明されていますが、少量のデータが改ざんされていないことを保証する上でMD5はどの程度効果的ですか?

サイズが数ページの小さなテキストファイルがいくつかあります(サイズが15kbだとします)。私はそれらでSHA-256を使用してきましたが、代わりにMD5を使用できる方がはるかに便利です。

MD5はこれらの15kbの小さなテキストファイルのハッシュダイジェストとしてどの程度安全ですか?悪意のあるパーティは、このような少量のデータに対して衝突を発生させることができますか、それともサイズが小さいため、これは困難な作業になりますか?

55
thebunnyrules

入力のサイズは関係ありません。実際、 birthday paradox のため、衝突を保証するためにハッシュのサイズ以上は必要ありません。衝突を回避する最良の方法は、SHA-2などの、それらに対して脆弱ではないより強力なハッシュを使用することです。ただし、MD5が安全であるpreimage attackと呼ばれる衝突攻撃よりも難しい攻撃について説明しています。

攻撃には3つのタイプがあります* その結果、同じダイジェストを持つ2つのファイルが作成されます。

  • 1番目のプリイメージ-特定のハッシュに解決される入力を検索します。

  • 2番目のプリイメージ-結果のハッシュを変更せずに入力を変更します。

  • Collision-同じハッシュを持つ2つの異なる入力を見つけます。

これらはブルートフォース検索よりも効率的に実行できる場合、攻撃と呼ばれます。衝突は依然として自然に発生する可能性があり、実際には pigeonholeの原則 により、重要な入力が保証されますが、ハッシュは意図的にを困難にするように設計されています実行します。 MD5のサイズの出力を持つハッシュの場合、ランダムな偶発的な衝突の可能性は非常に低くなります。 1秒あたり60億個のランダムファイルをハッシュしても、2つのハッシュが衝突する可能性が50%になるまでには100年かかります。 MD5は、偶発的な破損を検出するための素晴らしいです。

強力なnビットハッシュ関数は、セキュリティレベルが2になるように設計されていますn 1回目と2回目のプリイメージ攻撃、およびセキュリティレベル2n/ 2 衝突攻撃に対して。 MD5のような128ビットハッシュの場合、これは2のセキュリティレベルを持つように設計されたことを意味します128 プリイメージと264 衝突に対して。攻撃が改善するにつれて、攻撃が提供できる実際のセキュリティレベルは徐々に失われます。

MD5は 衝突攻撃に対して脆弱 2に相当するものを必要とします18 意図された2の代わりにハッシュ呼び出し64 搾取する。攻撃者がbothファイルを生成しない限り、衝突攻撃ではありません。 ファイルがあり、ハッシュを変更せずに悪意を持ってファイルを変更したい攻撃者は、2番目のプリイメージ攻撃をマウントする必要があります。これは、最新のテクノロジーを使用したMD5に対して 完全に実行不可能 です( 最高の攻撃 2の複雑さ123.4、MD5の理論上の最大値2と比較128)。衝突攻撃は、さまざまな状況に関連しています。たとえば、バックドアなしで攻撃者によって作成された実行可能ファイルが与えられた場合、それをハッシュして保存できます。その後、その実行可能ファイルをバックドアバージョンに置き換えることができますが、ハッシュは害のないものと同じです!これは certificates の問題でもあります。この場合、誰かが所有するドメインの証明書を送信できますが、証明書は所有していないドメインの証明書と意図的に衝突します。

保存されているハッシュが改ざんされておらず、正しいと信頼できる場合、および検証対象のファイルが攻撃者によって作成された(または影響を受けていない)限り、MD5を使用してファイルを検証しても安全です。ただし、将来的にMD5に対する潜在的な実際のプリイメージ攻撃がデータを危険にさらすのを防ぐために、より強力なハッシュを使用することは依然として良い考えです。非常に高速でありながら暗号的に安全な最新のハッシュが必要な場合は、 BLAKE2 を確認することをお勧めします。

* @LieRyanによって言及されているように、すべてのマークルダンガードハッシュに影響を与える長さ拡張攻撃など、MD5に対する他の攻撃もありますが、これらは既知の正しいハッシュに対するファイルの整合性の検証には関係ありません。

chosen-prefix衝突攻撃 と呼ばれる衝突攻撃の変種は、2つの任意のメッセージ(プレフィックス)を取得し、各メッセージに追加されたときに衝突ダイジェストをもたらす2つの値を見つけることができます。この攻撃は、古典的な衝突攻撃よりも簡単に実行できます。長さ拡張攻撃と同様に、これはマークル–ダムガードのハッシュにのみ適用されます。

93
forest

それはあなたが自分自身を防御したいものに依存します

セキュリティは万能のゲームではありません。もしそうなら、12941の異なるハッシュアルゴリズムはありません。代わりに、すべてのセキュリティ対策が特定の種類の攻撃からあなたを守ることを理解する必要があります。ログインするたびに_whereD1DweG0sowron6_を入力するのが楽しいからではなく、ランダムにアクセスする人を防ぐためにコンピューターにパスワードを設定します。

ハッシュアルゴリズムについては、「暗号化ハッシュ」と「非暗号化ハッシュ」に大きく分類できます。暗号化ハッシュアルゴリズムは多くの攻撃に耐えるように設計されていますが、非暗号化ハッシュは可能な限り高速になるように設計されています。1 たとえば、MD5は暗号化ハッシュと見なされていますが、壊れているため、非暗号化ハッシュとしてのみ使用できます。

非暗号化ハッシュを使用する場合

ある場所から別の場所にファイルをコピーするときにビットフリップを検出することが目的の場合(たとえば、サムドライブからラップトップに)、MD5が最適です。 高速で、暗号化されていないハッシュ が良いと言っても私は行きます。ファイルをコピーするとき、現実的には攻撃者の干渉を恐れる必要はありません。ハッカーがカーネルを変更できることに偏執的である場合、ハッシュを追加しても問題は解決しません。

攻撃者の干渉によるファイルの整合性の確認

これらのファイルに署名して公開しようとする場合、攻撃者は同じハッシュで正当なファイルを作成する可能性があります。つまり、悪意のあるファイルでも署名は有効です。

元のメッセージ_m1_が次のようになっているとします。

私はここにバニーが支配することを宣言します!

ハッシュ関数h(m1)を使用して、ダイジェスト_d1_を取得します。その後、ダイジェスト_d1_に署名し、署名_s1_を取得します。

次に、メッセージ_m1_、署名_s1_、およびハッシュ関数h()を公開します。

私はシナリオの攻撃者である可能性があり、選択したハッシュ関数とまったく同じハッシュを持つメッセージ_m2_を作成します。

犬はあらゆる点でバニーよりも優れていることが公に知られています...

h(m1) = h(m2) = d1以降、署名_s1_は元の_m1_と悪意のある_m2_の両方に有効です。

このような攻撃から身を守るためには、衝突に対する耐性が高い強力なハッシュアルゴリズムを選択することが重要です。これは、_m2_ where h(m2) = h(m1)を見つけるのが非常に難しくなることを意味します。

SHA256やSHA512だけでなく、他にもたくさんの選択肢があります。誰もがお気に入りの非主流のハッシュ関数を持っているようですが、SHA256とSHA512は非常に広くサポートされており、これらのハッシュをサポートしないシステムを見つけるのは難しいでしょう。また、ファイルが非常に小さいため、ハッシュの計算はほとんど瞬時に行われるはずです。

たとえば、私の800MHzマシンでは、16kのランダムファイルのSHA512ハッシュを計算するのに3msかかったので、トースターでも比較的高速です。


1 乱数ジェネレーターでも同じことがわかります。暗号化PRNGは、推測が非常に難しい乱数を提供することを目的としていますが、非暗号化PRNGは、一見するとランダムに見える数値を提供し、それを高速に行うことを目的としています。

12
MechMK1

ファイルのサイズに違いはありません。 MD5は Merkle–Damgård構文 に基づいています。これは length extension attack に対して脆弱です。 15kbは、長さ拡張攻撃を行うのに十分です。長さが数百バイトのMD5コリジョンを生成する既知のコリジョンとメソッドはたくさんあります。ベースコリジョンが見つかると、長さの拡張に対して脆弱であることは、それらを使用して任意の数のコリジョンを生成できることを意味します。

0
Lie Ryan

それ自体のサイズはそれほど重要ではありません。実際の衝突データは単一のブロックと同じくらい小さい場合があります。

ただし、PDFなどのコレクションよりも、テキストファイルのコレクションの方がはるかに安全です。

どうして?衝突攻撃の結果は、通常、ペアの両方のファイルに「ランダムに見えるゴミ」が含まれるためです。リッチなフォーマットでは、このランダムに見えるごみは見えないように隠すことができるため、攻撃者はコレクション管理者をだまして、衝突するファイルのペアの1つを受け入れさせることができます。

ただし、テキストファイルでは、内容は誰にとってもわかりやすいものです。

0
Peter Green

短い答え:いいえ、MD5を使用してファイルの整合性を確認することは安全ではありません。短いまたは長いです。

完全な答えはエラーの分布にどの程度自信があるかによって異なります。

シリアルポートのようなわずかに損失のあるチャネルでの送信が原因で、ファイルの各位置でビットフリップが発生する可能性がありますか?その場合、MD5を使用できますが、CRCを使用する方がはるかに安価です。これは、単一ビットフリップを検出することが保証されており、CRC多項式の標準的な選択によってすべての奇数のビットフリップを検出することによって保証できます。

しかし、あなたはsecureについて質問しました。これは、損失の多いシリアルポートよりも少しインテリジェントな敵を検討していることを示唆しています。 そうでない場合confidentエラーは独立したランダムなビットフリップであるため、MD5またはCRCは使用しないでください。インテリジェントな敵がペアを見つけるのは非常に簡単です共通のMD5ハッシュ、またはCRCチェックサムを共有する個別のファイルのセット。多くのシナリオで、これにより、攻撃者はMD5システムが検出しないドキュメントを偽造することができます。ファイルのサイズは重要ではありません。MD5の衝突は、64バイトという短いファイルで簡単に見つけることができ、それらの長さに制限はありません。

衝突攻撃、プリイメージ攻撃、セカンドプリイメージ攻撃の技術的な違いについて議論する場所があります。 一般的な質問であるかどうかについての回答ファイルの整合性を検証するための安全はそのような場所ではありません。 特定のプロトコルがあり、攻撃者の正確な能力と正当なユーザーがプロトコルでどのように動作するかを明確に説明できる場合and実装の制約があります。 must MD5を検討するようにハッシュ関数の選択を制限してから、(おそらくcrypto.SEで)そのプロトコルでMD5を使用してsafeを実現するかどうかについて議論できますそのような敵に対して達成したいセキュリティ。

ただし、SHA-2、SHA-3、またはBLAKE2を使用する方がはるかに簡単で安全です。

0