「MD5はもう使われていないです」という記載は今までに何度か目にしたことはあったのですが、いかんせんエンジニアになってから暗号周りの勉強は後回しにしていたので、なぜもう使われないのか、というところまではわかっていませんでした。
最近暗号技術についての勉強をし始めたので、MD5がなぜ今は使われないのか、というのを備忘録的に今回の記事ではまとめてみようと思います。
MD5とは?
Ronald Rivestという方が1991年に作ったハッシュ関数の一つで、任意の長さの入力値に対して128ビットのハッシュ値を出力します。
そのため例えば、qwerty
という文字列が与えられた場合にはd8578edf8458ce06fbc5bb76a58c5ca4
という返り値が返ってきます。
なお、MD5は同氏がすでに作っていたMD4の改良版という位置付けとなっています。
ハッシュ関数の3つの安全性について
本格的にMD5が使われなくなった理由を書く前に、広く使われるハッシュ関数に対して求められる3つの安全性について説明します。
ハッシュ関数の3つの安全性はそれぞれ下記のように呼ばれています。
- 一方向性
- 衝突困難性
- 第二現像計算困難性
上記はハッシュ関数の安全性の基準を示しており、どれか1つでも欠けると安全なハッシュ関数ではないと見做されてしまいます。
下記がそれぞれの説明です。
一方向性(One Wayness)
一言で言うと、ハッシュ値から元の値を計算することが困難であることを表します。
これはシンプルですね。
衝突困難性(Collision Resistance)
ハッシュ関数を通す前のインプットと返されたアウトプットでは使える文字数に差があるので(アウトプットの方が少ない)、全く別のメッセージをハッシュ関数に渡しても同じアウトプットが返ってくる可能性があります。(このことをハッシュ値の衝突と呼ぶ)
つまり、hash(message1) = hash(message2)
となる場合があるということです。
衝突困難性というのは、このように衝突するようなメッセージの組み合わせを計算で割り出すことが困難であることを指します。
第二原像計算困難性(Second Preimage Resistance)
一言で言うと、ハッシュ関数に通す前の生のメッセージとそのメッセージのハッシュ値を手がかりに、同じハッシュ値を得られる別のメッセージを計算することが困難であることを指します。
余談ですが同じハッシュ値になる別のメッセージ
の存在が出てくるので衝突困難性になんとなく似ているなと思ったらそのようでした。
暗号技術のすべてという本では、第二原像計算困難生は「弱い意味での衝突困難性」、衝突困難性は「強い意味での第二原像計算困難生」 とも紹介されていました。
MD5が使われなくなった理由
ハッシュ関数に求められる3つの安全性について説明したところで今回の記事の本題に入りますが、
MD5が使われなくなった理由を一言で言うと、衝突困難性が破られてしまったからです。
2011年にIETFが公表したRFC6151によると、
2.6GHzほどの性能の当時のインテル製のプロセッサを使い10秒ほどで衝突するペアを見つけ出すことが可能だということが判明しました。
また、128ビットの出力値というのがハッシュ値としては短すぎたようで、ブルートフォース攻撃によって最大でも2、3日かければ解読できてしまうというのもあったようです。
なお、現在広く使われているSHA256においては文字通り256ビットの出力値が返ってくるようですが、こちらであれば元のメッセージが十分に長ければ1年以上やさらに長い時間をかけても解読することはできないようです。
これらの要因からMD5は安全なハッシュ関数とは見做されなくなり、SHA1やSHA2ファミリーがハッシュ関数として広く使われ始めるようになりました。
まとめ
ということで今回の記事では暗号技術の勉強のノート程度にMD5が使われなくなった理由と暗号技術についての知識をちょびっとまとめてみました。
やっぱり読むだけで知った気になるのとこういった形でアウトプットするのでは身に付き方が全然違いますね。
あとDictionary Attackというのも今回の記事を書く中で初めて言葉として知りました。平文のパスワードが流出しているかを調べられるのは知っていたのですが、ハッシュ値で流出済みかを調べることもできるのですね。(考えてみれば当たり前な気もしますが)
「Passwordは長い方がいい」というのは技術者でなくても知っていることですが、こうやってなんでそうなのか、というのを調べるのはたのしいですね
また今回の勉強を通して下記の点も気になったので、次回以降の記事でまとめてみたいと思います。
- MD5が使われなくなってからSHA1が現れてすぐにいなくなった経緯
- SHA2ファミリーが現在の主流となっている理由