ハッシュとは、ファイルやデータを数学的に圧縮したもので、内容が同じであれば同じ値になります。
MD5アルゴリズムのハッシュ値は32個の16進数(128bit)で構成される文字列でほぼ無限の組み合わせと言えます。
ファイルの信憑性などを確認する偽造防止などに使われ、このハッシュ値で産出された数字とファイルを一緒に送って、偽造されていないか?を確かめる。
もし偽造をしていれば、ファイルやデータの中身が一つでも違うと全く違ったハッシュ値となる。
ハッシュ値
MD5 のハッシュ値については、パソコンレベルでも数10分程度で、同一ハッシュ値の非ユニークなデータ列を生成できる実装が広まっている。すなわち、強衝突耐性は容易に突破されうる状態にある(SHA-0/SHA-1アルゴリズムについても、MD5ほど容易ではないが突破される脆弱性が発見されている)。
ただし、任意に与えられたハッシュ値に対して、(何らかの別の)データを生成する実装が広まっているわけではないので、弱衝突耐性が容易に突破されうる訳ではない。また、任意に与えられたハッシュ値に対して、改竄者の意図どおりのデータ列を容易に生成できる訳でもない(もしそうならば、それは既に暗号ではない)。
強衝突耐性の突破とは例えば、同一のハッシュ値を持つ非ユニークな2つのデータ列D1とD2のペアを1つ発見できた、ということである。なお、この場合D1やD2が意味を持つデータであるかどうかは問われない。また、データ列D3のハッシュ値がHであったとして、この”特定の”ハッシュ値Hに対して、同一のハッシュ値を持つような他のデータ列D4を発見できたとしたら、それは弱衝突耐性を突破された事を意味する(即ち、D3とHの組み合わせで無改竄性を証明できなくなる)。
そのため、直ちにこれらのハッシュアルゴリズムを用いている暗号化通信が盗聴・改竄されたり、電子署名の有効性が無くなると言うわけではない。しかし、強衝突耐性が突破されたという事は、将来的には攻撃手法や計算能力の進化により、弱衝突耐性も突破されうるという事を暗示する。もし弱衝突耐性が突破されたとしたら、もはや暗号化通信や電子署名の無改竄性を証明できなくなり、その暗号化・署名システムは(半ば)死を意味する。
また、暗号化・署名システムのintegrity(例えば最良攻撃手法に対して十分に頑強であるという事)にハッシュ強衝突耐性の突破が困難であるという前提がもし有った場合には、そのシステムのintegrityも当然に失われる事になる。Integrityを要求されるシステムでは、その再検証が最低限必要となる。
文字列によるMD5算出
echo -n ‘******’ | md5sum
ファイルのハッシュ値算出
$ md5sum ファイル名
文字列からハッシュ値を確かめる
md5sum
abc <–入力してRETURN
Ctrl+Dでハッシュ値がでてくる
ファイルのハッシュ値を確かめる
$ md5sum -b ファイル名
Linuxシステムおいてはテキストファイルとバイナリファイルの区別をしていないため、バイナリファイルに対し-tオプションを指定しても指定しない時の値と同じ値を出力する。
バイナリファイルとテキストファイルに区別のあるOSにおいては、別のハッシュ値を出力する。
Linuxシステムにおいては、明示的にテキストファイルと指定する場合に利用するといいだろう。
ファイルga.txtのMD5ハッシュ値をテキストとして計算する場合は、次のコマンドだ。
$ md5sum -t ファイル名