web-dev-qa-db-ja.com

MD5のようなハッシュ関数はどのようにユニークですか?

MD5にいくつかの衝突があったことは承知していますが、これはハッシュ関数に関するより高度な問題です。

MD5が任意の文字列を32桁の16進数値にハッシュする場合、 Pigeonhole Principle に従って、一意の32桁の16進数値よりも一意の任意の文字列があるため、これは一意ではありません。

55
Aly

一意であることは保証できませんが、32桁の16進数値(16 ^ 32)には約3.402823669209387e + 38の異なる値があります。これは、アルゴリズムの背後にある数学が適切な分布を与えると仮定すると、重複が発生する確率が驚くほど小さいことを意味します。あなたはそれがISそれがどのように使用されるかを考えているときに複製することが可能です。 )。何かが変更され、同じMD5チェックサムが発生する可能性はばかばかしくありません。

編集:(最近のニュースre:SHA1ハッシュを与えられた)上記の答えはまだ保持されますが、MD5ハッシュが操作に対するあらゆる種類のセキュリティチェックとして機能することを期待すべきではありません。 SHA-1ハッシュは2 ^ 32(40億を超える)のように衝突する可能性が低く、入力を制御して同じ値を生成できることが実証されています。 (これはかなり前にMD5に対して実証されました)。最近、同じハッシュ値を生成するために悪意を持って何かを変更した人がいないことを確認したい場合は、SHA-2で確実な保証が必要です。

一方、セキュリティチェックのコンテキストにない場合でも、MD5には有用性があります。

SHA-2ハッシュは計算するのに十分安価であり、とにかくそれを使用するだけでよいという議論をすることができます。

94
Mike Cargal

あなたは絶対に正しいです。しかし、ハッシュは「一意」に関するものではなく、「十分に一意」に関するものです。

他の人が指摘しているように、MD5のようなハッシュ関数の目標は、2つのオブジェクトが元々何であるかを知らずに(パスワード)、または全体を比較せずに(大きなファイル)簡単にチェックする方法を提供することです。

オブジェクトOとそのハッシュhがあるとしますO。別のオブジェクトPを取得し、それがOと等しいかどうかを確認します。これは、パスワード、またはダウンロードしたファイル(この場合、Oではなく、そのハッシュhO おそらくPに付属しています)。まず、Pをハッシュしてhを取得しますP

現在、2つの可能性があります。

  1. hO そしてhP 異なっています。これは、2つの値/オブジェクトで同じハッシュを使用すると同じ値が得られるため、OPが異なることを意味する必要があります。ハッシュは決定的です。 偽陰性はありません。
  2. hO そしてhP は同じ。あなたが述べたように、ピジョンホールの原理のために、このcouldは異なるオブジェクトが同じ値にハッシュされたことを意味し、さらなるアクションが必要になるかもしれません。

    a。可能性の数が非常に多いため、ハッシュ関数を信頼しているなら、「2つに1つがあった」と言うだけで十分かもしれません。128 衝突の可能性(理想的なケース)なので、O = Pと仮定できます。たとえば、文字の長さと複雑さを制限する場合、これはパスワードに対して機能します。パスワード自体ではなく、データベースに保存されているパスワードのハッシュが表示されるのはこのためです。 b。ハッシュが等しくなったからといってオブジェクトが等しいというわけではなく、OPを直接比較することもできます。 誤検知の可能性があります。

したがって、誤検出の一致がある場合でも、誤検出はありません。アプリケーションと、オブジェクトが常に等しいか常に異なると予想されるかによって、ハッシュは不要な手順になる場合があります。

9
Phil

定義上、暗号化一方向ハッシュ関数は Injective ではありません。ハッシュ関数に関しては、「一意」はかなり無意味です。これらの関数は他の属性によって測定され、特定のハッシュのプリイメージを作成するのを難しくすることにより、強度に影響します。たとえば、プリイメージの1つのビットを変更することで、何ビットのイメージが影響を受けるかを気にする場合があります。総当たり攻撃(特定のハッシュイメージのプリーイメージを見つけること)がどれほど難しいかを気にするかもしれません。衝突を見つけるのがどれほど難しいか気にするかもしれません: 誕生日攻撃 で使用される同じハッシュ画像を持つ2つの前画像を見つけることです。

5
M.A. Hanin

ハッシュされる値が結果のハッシュよりもはるかに長い場合に衝突が発生する可能性がありますが、ほとんどの目的では衝突の数はまだ十分に少なくなっています(2128可能なハッシュの合計であるため、2つのランダムな文字列が同じハッシュを生成する可能性は、理論的には10分の1に近い38)。

MD5は主に整合性チェックを行うために作成されたため、最小限の変更に非常に敏感です。入力を少し変更すると、出力が大幅に異なります。これが、ハッシュ値だけに基づいてパスワードを推測するのが難しい理由です。

ハッシュ自体は元に戻せませんが、純粋な総当たりで可能な入力値を見つけることはまだ可能です。 MD5を使用してパスワードハッシュを保存する場合は、常にソルトを追加する必要があるのはこのためです。入力文字列にソルトを含める場合、一致する入力文字列には、同じ結果を得るためにまったく同じソルトを含める必要があります。そうでない場合、出力に一致する生の入力文字列は自動ソルティングの後に一致しません(つまり、MD5を「リバース」してログインに使用することはできません。リバースMD5ハッシュはソルトされない可能性が高いためです)元々ハッシュの作成につながった文字列)。

そのため、ハッシュは一意ではありませんが、認証メカニズムを使用して十分に一意にすることができます(ソルティングの代わりにパスワード制限の妥当な引数の1つです:同じハッシュを生成する文字列のセットには、パスワードの制限に従わないため、ブルートフォースでハッシュを逆にすることはより困難です。明らかに、ソルトは依然として優れたアイデアです。

ハッシュが大きいほど、同じ入力セットに対して可能なハッシュのセットが大きくなるため、オーバーラップの可能性は低くなりますが、処理能力が十分に向上してブルートフォースMD5が自明になるまで、ほとんどの目的に適した選択肢です。

3
Alan Plum

(ハッシュ関数の日曜日のようです。)

暗号化ハッシュ関数は、非常に、非常に、非常に低い複製率を持つように設計されています。あなたが述べる明白な理由のために、レートは決してゼロになることはできません。

Wikipediaページ は参考情報です。

2
bmargulies

マイク(および基本的に他のすべての人)が言ったように、それは完璧ではありませんが、それは仕事をします、そして衝突性能は本当にアルゴリズム(実際にかなり良いです)に依存します。

本当に興味深いのは、異なるデータで同じハッシュを保持するためのファイルまたはデータの自動操作です。これを参照してください デモ

2
Bolster

他の人が答えたように、ハッシュ関数は定義により一意の値を返すことを保証されていません。なぜなら、無限の入力に対して固定数のハッシュがあるからです。その重要な品質は、衝突が予測不能であることです。

言い換えると、それらは簡単に元に戻せないため、同じハッシュ結果(「衝突」)を生成する多くの異なる入力が存在する可能性がありますが、そのうちの2つを見つけることは計算上実行不可能です。

1
Pinko