MD5はまだファイルを一意に識別するのに十分ですか?


139

MD5アルゴリズムの破壊やセキュリティの問題などを考慮すると、MD5ハッシュはファイルを一意に識別するのに十分な方法と見なされていますか?ここでのセキュリティは私の主な関心事ではありませんが、各ファイルを一意に識別することが重要です。

何かご意見は?


2
私は現在、自分のアプリケーションの1つで実際に使用しています。私が認識している限り、ファイルを一意に識別するのに十分です。
利用不可

2
おそらくこの質問を見つけるでしょう:stackoverflow.com/questions/862346/…便利です。
シャープトゥース

特定する必要があるファイルの数は?128ビットを出力するため、数千のファイルを識別しようとしている場合は問題ありません。しかし、それよりもはるかに多くのIDを取得しようとしている場合は、衝突/誕生日のパラドックスにぶつかる可能性があります。
Marcin、

それらは画像ファイル、jpg、png、gifになります。そして、はい、制限は数千になると思います...しかし、おおよそ何ファイルが問題を引き起こすと思いますか?
Ranhiru Jude Cooray

回答:


89

はい。MD5はセキュリティの観点から完全に破壊されていますが、偶発的な衝突の可能性はまだほとんどありません。信頼できない人や悪意のある人によってファイルが作成されていないことを確認してください。


2
@なし:最初の質問については、こちらをご覧ください。他の質問は理解できません。
Marcelo Cantos

9
@ 0xA3:あなたも私も、OPがどのファイルを参照しているか、または侵害によってどの程度の損害が発生するかはわかりません。それは私たちが知っているすべての子供たちの赤ちゃんの写真コレクションである可能性があります。私の目標は事実を提供することです。他の誰かが彼らとすることは彼らのビジネスです。Bruce Schneierがパスワードを書き留めておくことをお勧めします。すべてをフォートノックスに保管する必要はありません。植木鉢の下でうまくいくものもあります。
Marcelo Cantos

3
@Marcelo Cantos、ここで欠けているのは、「セキュリティ」という用語の差別化や展開です。明らかに人々はチェックサム作業のあらゆる使用について「セキュリティ」を想定していますが、用語Marceloが意味する可能性が高いのは「実験室」であることです。
hpavc

5
私は強く同意しません。異なるハッシュ値は、ファイルが異なることを示します。ただし、ハッシュ値が等しい場合:ハッシュが同じである場合、「両方が同じである可能性が高い」とは言えません。バイト単位でしか比較できません。ハッシュは、ファイル全体のさまざまな値の数より桁違いに小さいため、各ハッシュ値には多くの衝突が発生する可能性があります。既知のファイルを(既知のハッシュを使用して)コピーする場合にのみ、同じハッシュ値が2番目のハッシュ値を正しくコピーしたことを「おそらく意味します」(ただし、100%確実ではありませんが、可能性が高い)。
Olivier Dulac 2016年

3
OK、私の数学はひどい。GUIDには約122ビットのエントロピーがあるため、10億個のファイルのどこかで衝突が発生する確率は、約2 ^(2 * 30-122)= 2 ^ -62です。これは私の元の計算よりもはるかに高いですが、それでも約4千分の1とごくわずかです。
Marcelo Cantos

32

実際の目的では、作成されるハッシュは適切にランダムになる可能性がありますが、理論的には、ピジョンホールの原理により、常に衝突の可能性があります。異なるハッシュを持つことは確かにファイルが異なることを意味しますが、同じハッシュを得ることは必ずしもファイルが同一であることを意味しません。

したがって、特にハッシュアルゴリズムで衝突が発生しやすいことがわかっている場合は、セキュリティが問題であるかどうかに関係なく、その目的でハッシュ関数を使用することは常にチェックの最初のステップにすぎません。同じハッシュを持つ2つのファイルが異なるかどうかを確実に見つけるには、それらのファイルをバイト単位で比較する必要があります。


16
@Ranhiru。いいえ。ハッシュは「MD5」の場合は16バイト長の「サマリー」値を提供します。ファイルが同一であることを保証するには、バイトごとのチェックを行う必要があります。これは、どのハッシュアルゴリズムを選択しても当てはまりますが、常に衝突する可能性があります。
PaulG

6
@Ranhiru。この答えをもう一度読んでください。これは、ここで最も包括的なものです。ハッシュは最初のステップとして使用できます。これにより、ファイルが同一であることを99.99 ^ e%の確実性で得ることができますが、完全に100%確実にしたい場合は、バイトごとのチェックを行う必要があります。これは、MD5、SHA、またはその他のアルゴリズムを使用しているかどうかに当てはまります。
PaulG

7
この答えは間違っています。改ざんの防止と一意性の検証は同じことです。また、ハッシュは一意性を保証しませんが、実際の比較も保証しません。実際、偶発的にハッシュが衝突する可能性は、通常の太陽ガンマ線放出によって生成されたCPUのグリッチが原因で比較が失敗する確率よりも実際に低くなっています。また、ファイルの唯一のソースはWebサーバー内の世界の反対側にあることが多く、比較のために持つ唯一の独立した情報はハッシュであることを忘れないでください。
Marcelo Cantos

8
@Marcelo。偶発的な衝突が偶然のビットフリップよりも少ない可能性があることを論理的に推論することはできません(バイトごとの比較を行っている間)。ハッシュを構築するときに、ビットフリップの同じ可能性がまだあります(処理時間が長くなるため、間違いなくもっと多くなります)。@Thomasはもともとポイントを上げて、ビットフリップの影響については非常に議論の余地がありますが、一意性を特定する方法は保証されていないことを示唆しています。最も悲観的な見積もりは、GB /時間あたり1フリップであり、ECC RAMはそれでも削除します。
PaulG

2
[要出典「ハッシュが誤って衝突の可能性は、正常太陽ガンマ線放射によって生成されたCPUでグリッチに実際に低い比較の確率が失敗することである」
endolith

20

敵がいない場合は、MD5で十分です。ただし、誰かが(意図的に)同じ値にハッシュする2つの異なるファイルを作成することができ(衝突と呼ばれます)、状況によっては、これが問題になる場合とそうでない場合があります。

既知のMD5の弱点が特定のコンテキストに適用されるかどうかを知ることは微妙な問題であるため、MD5を使用しないことをお勧めします。衝突に強いハッシュ関数(SHA-256またはSHA-512)を使用することが安全な答えです。また、MD5を使用することは悪い広報です(MD5を使用する場合は、自分自身を正当化する必要があることを覚悟してください。SHA-256を使用することに誰も疑わないでしょう)。


2
読者がハッシュに慣れていない場合、この答えは少し誤解を招くかもしれません。SHAにはハッシュの衝突を防ぐ魔法はありません。ハッシュの衝突攻撃に対してより耐性があります。99.999 ^ e%を超えてファイルが同一であることを確実にしたい場合でも、バイトごとのチェックが必要になります。
PaulG

7
実際には、宇宙線がビットを反転する(たとえば、a return 0;をに変換するreturn 1;)ため、バイト間の比較は失敗する可能性があります。これは非常にまれですが、SHA-256との衝突のリスクはそれよりもさらに小さくなります。数学的には、同じ値にハッシュする2つのファイルが同一であるかどうかはわかりませんが、コンピューターを使用して比較している限り、ファイル自体を比較しても同じであるとは言えません。つまり、99.999 .... 9%の確実性を超えることは無意味であり、SHA-256はすでにそれ以上のものを提供しています。
Thomas Pornin

2
何、あなたはECCメモリを使用しませんか?;)。良いコメント、非常に興味深い考え。
PaulG

1
ブリキの帽子をお忘れなく!さらに真剣に、どのようにして衝突に関するこれらのファクトイドを知って、これを何らかの方法で検証しましたか?
James P.

@ThomasPornin Cosmic rayのビットフリップはMD5メソッドにも影響を与えるため、さらに悪化します。
内部石

9

md5は衝突を引き起こす可能性があります。理論的には、可能性は非常に低いですが、100万行のファイルが同じハッシュを生成する可能性があります。値を保存する前に、運をテストしてmd5の衝突をチェックしないでください。

私は個人的にランダムな文字列のmd5を作成するのが好きです。これにより、大きなファイルのハッシュのオーバーヘッドが削減されます。衝突が見つかった場合は、追加されたループカウンターを使用して繰り返しハッシュします。

ピジョンホールの原則について読むことができます。


6

私はそれをお勧めしません。アプリケーションがマルチユーザーシステムで動作する場合、同じmd5ハッシュを持つ2つのファイルを持つユーザーがいる可能性があります(エンジニアであり、そのようなファイルで遊ぶか、単に興味があるかもしれません-それらはhttp:/から簡単にダウンロードできます。 /www2.mat.dtu.dk/people/S.Thomsen/wangmd5/samples.html、私はこの回答を書いているときに自分で2つのサンプルをダウンロードしました)。もう1つは、なんらかの理由で一部のアプリケーションがそのような複製を保存する可能性があることです(そのようなアプリケーションが存在するが可能性が存在するかどうかはわかりません)。

プログラムによって生成されたファイルを一意に識別している場合は、MD5を使用してもかまいません。それ以外の場合は、衝突がまだ判明していない他のハッシュ関数をお勧めします。


2

個人的には、他のオブジェクトの生のチェックサム(メソッドを選択する)を使用して、一意の識別子が本当に必要なときに、一意の識別子として機能しすぎていると思います。この使用のためにオブジェクトをフィンガープリントすることは意図されておらず、uuidまたは同様の整合性メカニズムを使用するよりも多くの考えを必要とする可能性があります。


0

MD5が壊れています。代わりにSHA1を使用できます(ほとんどの言語で実装されています)


これは完全に良い答えです。MD5は、2018年5月以降、ヨーロッパの法律と会計のユースケースでは受け入れられません。
バートシンネマ2017

@BertSinnemaは、どのハッシュ関数が受け入れられるかなどを定義するソースを教えてくれませんか?
berezovskyi

@GregSchmitは、OPが暗号強度自体を気にしていなかったためと考えられます。「セキュリティ以外のコンテキストでMD5をすでに使用しています。コードの更新に時間をかける必要がありますか?」という質問を理解しました。ものの種類。そして、この文脈では、答えはおそらく間違っていて、SHA1もそれ以来壊れていました。
berezovskyi

0

短い(<数K?)文字列(またはファイル)をハッシュする場合、2つのmd5ハッシュキーを作成できます。1つは実際の文字列用で、もう1つは短い非対称文字列と連結された文字列の逆用です。例:md5(reverse(string || '1010'))。追加の文字列を追加すると、一連の同一ビットで構成されるファイルでも2つの異なるキーが生成されます。このスキームでも、2つのハッシュキーが同一でない文字列に対して同一である理論上の可能性があることを理解してください。ただし、確率は非常に小さいようです。単一のmd5衝突確率の2乗程度で、時間を節約できます。ファイルの数が増えると、かなりの量になる可能性があります。2番目の文字列を作成するためのより複雑なスキームも検討できます。

衝突をチェックするには、このテストを実行して、データベース内のすべてのbit_vectorのmd5ハッシュキーの一意性を確認します。

md5(bit_vector)によるbit_vector
グループを含むdbから、md5(bit_vector)、count(*)、bit_and(bit_vector)を選択し、bit_vectorにbit_and(bit_vector)<> bit_vectorを指定します


スマートなアイデア。「攻撃者」が同じmd5ハッシュで偽のファイルを作成した場合、「攻撃者」があなたの「塩漬け」を知らない限り役に立たず、内容を元に戻すと別のハッシュが作成されます。そのような2つのmd5キーを使用すると、オッズが大幅に減少します。ローカルで計算する前にソルトを使用する「攻撃」を防ぐだけで十分な場合。
Wolf5

0

MD5は、大量のファイルデータを保存する場合の確率の指標として考えるのが好きです。

ハッシュが等しい場合は、バイト単位でファイルを比較する必要があることを知っていますが、それは誤った理由で数回しか発生しない可能性があります。それ以外の場合(ハッシュが等しくない) 。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.