みんなのちからになりたい

コピペでブログラムつくっていきたい

MD5とかSHA-2とか

自分はあまりする機会ないけどクソでかい文字列とかバイナリとかの同一値を比較するときハッシュ値で比較すること多いけど、MD5とか16バイトだから同じハッシュ値のものが出来る可能性ってどのくらいなのかなと思って調べた。
ハッシュの衝突耐性っていうのか。

MD5 - Wikipedia

ハッシュの衝突耐性について
MD5ハッシュ値については、パソコンレベルで、数10分程度で、同一ハッシュ値の非ユニークなデータ列を生成できる実装が広まっている。すなわち、強衝突耐性は容易に突破されうる状態にある(SHA-0/SHA-1アルゴリズムについても、MD5ほど容易ではないが突破される脆弱性が発見されている)。
ただし、任意に与えられたハッシュ値に対して、(何らかの別の)データを生成する実装が広まっているわけではないので、弱衝突耐性が容易に突破されうる訳ではない。また、任意に与えられたハッシュ値に対して、改竄者の意図どおりのデータ列を容易に生成できる訳でもない(もしそうならば、それは既に暗号ではない)。

これを回避する手段としてより安全性を増したSHA-2を使いましょうということっぽい。

SHA - Wikipedia

SHA-2
SHA2のハッシュキーの長さは、256ビット=2256(約 1.579×1077)通りのハッシュ値をとり、64桁の16進数で表される。 SHA-2を求めるには、例えば、
gpg --print-md SHA256 filename
などとすることもできる。
SHA256("") = e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855 (入力データ長が0バイトの場合)

256bit、要はMD5の倍なのでハッシュの衝突はほぼ無理らしい。すごい。
説明、ここがよくわかりやすかった。
wiz.code [ SHA-256の概要 ]

rubyで使う方法。
Ruby で文字列のハッシュ値を得る

require "digest/sha2"

p umaibou: Digest::SHA256.hexdigest("umaibou")

$ ruby sha2.rb
{:umaibou=>"4861a27a39540d02df656960ec4f784e2bc1f0dacf366cfb28265d901297b925"}

勉強になる。