Edited at

md5ざっくりまとめ

More than 3 years have passed since last update.


  • MD5(Message Digest Algorithm 5)

  • 任意の長さの原文を元に128bitの値を生成するハッシュ関数の1つ

  • 与える値の長さがなんであれ、生成されるのは128bitの値になる

  • 同じ入力値からは必ず同じ値が得られる一方、少しでも異なる入力値からは全く違う値が得られる

  • データの伝送や複製を行う際、入力値と出力値でハッシュ値を求めて一致すれば途中で改ざんや欠落が起こっていないことを確認できる

  • ファイルの一致を確認する用途で使われていることが多い印象をうける(個人的な感覚)

  • 近年では同一のハッシュ値を持つ異なる原文のペアを効率よく探索することができるようになっていて、セキュリティ用途でmd5を使うのは十分に安全とは言えない状況になってきている。SHA-2などより安全なハッシュ関数の使用が推奨されている

  • 【注意】 ハッシュ化と暗号化は異なるので注意。ハッシュ関数は不可逆な一方向関数を含むため、ハッシュ値から原文を再現することは(基本的に)不可能。一方、暗号化されたものは復号化できる。md5はハッシュ化の方。


Linuxのコマンドでファイルのmd5値を求める

md5sumコマンドを使う。

$ md5sum /tmp/sample.txt

d41d8cd98f00b204e9800998ecf8427e /tmp/sample.txt

// 適当な文字列を書き込む
$ echo "foo" > /tmp/sample.txt

// ハッシュ値は変わる
$ md5sum /tmp/sample.txt
d3b07384d113edec49eaa6238ad5ff00 /tmp/sample.txt


Rubyでmd5値を求める

Digest::MD5を使う。

require "digest/md5"

# 与えられた文字列に対するハッシュ値を文字列で返す
# => "\xAC\xBD\x18\xDBL\xC2\xF8\\\xED\xEFeO\xCC\xC4\xA4\xD8"
p Digest::MD5.digest("foo")

# 与えられた文字列に対するハッシュ値をASCIIコードを使って16進数の列を示す文字列にエンコードして返す
# => "acbd18db4cc2f85cedef654fccc4a4d8"
p Digest::MD5.hexdigest("foo")

# 新しいダイジェストオブジェクトを生成し、ファイル名で指定したファイルの内容を読み込み、そのダイジェストオブジェクトを返す
# => #<Digest::MD5: d3b07384d113edec49eaa6238ad5ff00>
p Digest::MD5.file('/tmp/sample.txt')


参考