web-dev-qa-db-ja.com

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

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

何かご意見は?

132

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

86
Marcelo Cantos

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

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

31
stapeluberlauf

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

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

19
Thomas Pornin

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

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

ピジョンホール原理 で読むことができます。

9
afilina

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

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

6
tach

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

2
hpavc

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

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

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

0
Shimmy

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

衝突をチェックするには、dbのすべてのbit_vectorsのmd5ハッシュキーの一意性についてこのテストを実行できます。

md5(bit_vector)、count(*)、bit_and(bit_vector)をbit_vectorでdbから選択します
md5(bit_vector)によるグループ化、bit_and(bit_vector)<> bit_vectorを持つbit_vector

0
marcopolo