ハッシュ関数 の一種です。


文字列を、「56EB9D56・・・・・」のような、128ビットの数値にしてくれます。



<生成される数値の主な特徴>

・1文字でも違う文字列ならば全く違う数値を生成する。

・生成される数値に偏りが少ない。

・生成された数値から容易に元の文字列を推測できない。


一般的に上記のような特徴があるとされています。

(どうも、いくつか弱点も見つかっているので、新しいハッシュ関数がいろいろ出ているようですが)


●補足

 あるページを見ましたら「MD5とは暗号化、複合化アルゴリズム」と書いているページがありました。

 これは、間違いです。

 MD5は、データを128ビットの数値に変換するハッシュ関数です。

 その応用例として、暗号化に利用することはできますが、128ビットの数値にしたが最後、元に戻せません。

 つまり複合化できないのです。

 できてしまったら上記の特徴「容易に元の文字列を推測できない」を満たしにくくなります。

 (実際には脆弱性があって、そこを付くといくつかの文字列は元に戻せますが)

 また、何MByteもあるデータでもMD5で128ビットに変換できますが、これをいつでも複合化できるとすると

 論理的にzipなどの圧縮もいつでも128ビットのファイルにできないとおかしいですよね?

 でも、そんな圧縮ソフトは聴いたことがありません。(論理的にできないですから)

 MD5は主に下の応用に書いていますように、電子署名のような使い方を目的としています。



<応用方法例>

MD5を実装したモジュールは、Java、Perlにありますし、C++でも標準ではないですがライブラリに存在しています。

様々な環境で使用できるようにはなっているのですが、いったい何に使用するんでしょうか?


・電子の指紋

 特徴のところで書きましたが、1文字でも違うとまったく違う数値を生成します。

 ということは、電子の文書をMD5にかけると、その電子文書の性質が生成された数値に反映されていることに

 なりますよね。

 たとえば、その電子文書の「これは」と書かれた箇所を「それは」と、1文字変えたとします。

 そうするとたった1文字の変更でもMD5の特徴から、ハッシュ値は全く違う数値になります。

 まるで、指紋みたいですよね。



・不正な書き変えがされていないかの検証 (電子署名)

 サーバAとサーバBとの間でデータのやりとりをしているとします。

 途中の経路でデータを改ざんされないか心配です。

 こんなときは、サーバAとサーバBの間で、同じキーワードを持っておきます。

 仮に「やったー」にしましょうか。

 そして、サーバAからサーバBにデータを送るときは、データとMD5のハッシュ値を送ることにします。

 ただし、ハッシュ値は以下のように作ります。

  ・「やったー」と送信データを文字列連結した結果をMD5のハッシュ関数にかけた値。

 

 そうすると、サーバBでもキーワードを知っているので、データと「やったー」を連結して同じハッシュ値を

 得られます。

 この値が送られてきたハッシュ値と違う場合は「改ざんされた!」と分かりますよね?

 

 また、MD5は、ハッシュ値からもとの文字列を推測しにくいという特徴があるはずなので

 キーワードも推測しにくいはずです!

 (弱点がいくつか見つかってるみたいですが。。)



・暗号化

 パスワードって、OSにファイルなどで保存しておきたくないですよね?

 どうしてかというと、人はそれほどたくさんのパスワードを覚えておけないのです。

 銀行のなんらかのパスワードと同じパスワードをOSに設定すると、OSのパスワードファイルを盗まれれば

 預金を下ろせてしまうかもしれません!

 ひゃ~。こわいですね~。

 こんなときは、MD5などでハッシュ値をファイルに保存しておきます。

 それだと元のパスワードが分からなくて、ログイン時にパスワードが正しいか比較できないじゃない!

 って思います?

 いえいえ、パスワードの比較をするときも、入力した値もMD5に通して、ハッシュ値同士で比べるのです。

 (これも今では弱点が見つかっているみたいですが。。)



結構応用範囲広いでしょ?

何年か前にこれらのことを知ったとき、世の中には賢い人がいるなぁ~と、かなり感心しました。



参考:

・ハッシュとは?

・連想配列(ハッシュ)を作るには?