暗号学的ハッシュ関数には要求される性質がある

MD5は1991年に開発された暗号学的ハッシュ関数でハッシュ値は128ビットである。

暗号学的ハッシュ関数には次のような暗号学的な性質が要求される。

  • ハッシュ値からそのようなハッシュ値となるメッセージを求めることが(事実上)不可能であること(原像計算困難性/一方向性)。
  • あるメッセージに対し同じハッシュ値となる別のメッセージを求めることが(事実上)不可能であること(弱衝突耐性)。
  • 同じハッシュ値となる異なるメッセージのペアを求めることが(事実上)不可能であること(強衝突耐性)。
  • メッセージの一部を変えたときハッシュ値が大幅に変わって元のメッセージのハッシュ値とは相関がないように見えること。

これらの性質によりメッセージの内容を保証するダイジェストとして利用することができる。

同一ハッシュ値の非ユニークなデータ列を生成できる

MD5は同一ハッシュ値の非ユニークなデータ列を生成できる実装が広まっており、強衝突耐性は容易に突破されうる脆弱性がある。

任意に与えられたハッシュ値からメッセージを復元する原像攻撃が、衝突攻撃ほど手軽に使えるわけではない。しかし強衝突耐性が破れている以上、攻撃者が比較対象の内容を用意できる場面(証明書、ソフトウェア配布、改竄検知用チェックサムなど)で MD5 を完全性の根拠にしてはならない。用途は非暗号のチェックサムやレガシー互換に限定する。

同一ハッシュ値となる文字列が発見されている

https://x.com/realhashbreaker/status/1770161965006008570

$ a=TEXTCOLLBYfGiJUETHQ4hAcKSMd5zYpgqf1YRDhkmxHkhPWptrkoyz28wnI9V0aHeAuaKnak
$ b=TEXTCOLLBYfGiJUETHQ4hEcKSMd5zYpgqf1YRDhkmxHkhPWptrkoyz28wnI9V0aHeAuaKnak
$ test $a = $b && echo '$a == $b' || echo '$a != $b'
$a != $b
$ test $(md5 -s $a | awk '{print $4}') = $(md5 -s $b | awk '{print $4}') && echo 'md5($a) == md5($b)' || echo 'md5($a) != md5($b)'
md5($a) == md5($b)