パスワードハッシュにmd5を使うのは小学生までだよねー


おおよそのUNIX-likeシステムでは、パスワードファイルはMD5でハッシュされるのが一般的だ(った)。

しかし、MD5は1996年に脆弱性が見つかって以来、あまり推奨される方式ではなくなっている。
Wikipediaで調べてみても「パソコンレベルで、数10分程度で、同一ハッシュ値の非ユニークなデータ列を生成できる実装が広まっている」などと恐ろしい事が書かれている。
つまり暗号化されていてもMD5ハッシュだと総あたりで易々と破られてしまうということになる。

こういった情勢のもと、多くのシステムでは、パスワードファイルのハッシュ方法を変えたり、または自由に変えられるようになっているので、もしお前らがUNIX-likeシステムを管理しているなら、いますぐ確認しろ。


じゃあ何に変えたらいいの→SHA-2かBlowfishおすすめ。


代替のハッシュ方法としては、Blowfish, SHA-2などが挙げられ、強度としてはBlowfishの方が高いようだが、そのアルゴリズムがNIST(アメリカ国立標準技術研究所)の承認をまだ受けてない事から、SHA-2を選択するケースが多い。

そのシステムがどのハッシュを採っているかは、ハッシュ文字列先頭から判断できる。

$1$: MD5
$2?$: Blowfish. ?はaかyかx.
$5$: SHA-2(SHA-256)
$6$: SHA-2(SHA-512)


FreeBSD 9.1-RELEASEはsha512(SHA-2)がデフォルト。手元にLinuxがないので確認できないのだが、UbuntuはまだMD5のよう。


しかしFreeBSDCVSを見ると2012年の7/15に変わっている。9系列で言えば9.1-RELEASEからデフォルトが変更されているようだ。

なお、9.1-RELEASEだから安心と思ったあなた。もしあなたが9.0以前から使い続けているなら注意が必要だ。これについては後述。



FreeBSDでハッシュ方法を変えるには


FreeBSDでは/etc/login.confで制御する。

以下の行を書き換えればOK。

        :passwd_format=sha512:\


md5ならmd5, SHA-2ならsha512, Blowfishならblfである。
書き換えた後、以下のコマンドでlogin.conf.dbを作り直すこと。

cap_mkdb /etc/login.conf

パスワードを再設定しないと新ハッシュになりません!


注意。上記設定をしたあと、もう一回パスワード設定しないと反映されません。

なんと不親切な、と思ったけど、よく考えたらそらそうだ。
もし自動的に変更しようとしたら、たとえばmd5でハッシュされた文字列を、いったん元に戻す必要がある。
元に戻させないようにわざわざハッシュしているんだから、自動でできるわけがない。


だから面倒でも、passwordコマンドを叩いて再設定すること。
同じパスワードであっても構わないが、まあ今回の作業の性質を考えると、このタイミングでパスワード変えた方がいいと思う。



9.0以前から使い続けていた人は注意

ということで、もしあなたのFreeBSDが9.1で、デフォルトのハッシュがSHA-2になっていたとしても、9.0以前にパスワード設定してそのままなら、ハッシュはmd5のままである。

実際に俺のマシンは9.0で新規インストールし、ついこの間9.1にアップグレードした。

$ uname -a
FreeBSD sylph 9.1-RELEASE FreeBSD 9.1-RELEASE #0 r243825: Tue Dec  4 09:23:10 UTC 2012     root@farrell.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  amd64
$ grep passwd /etc/login.conf|grep -v "^#"
	:passwd_format=sha512:\


とまあこの通り、SHA-2になっている。しかし以下のログで示すように、先頭が$1$になっておりMD5ハッシュであることを示している。
cap_mkdbしても同じ。(なおハッシュの核心部分はさすがにマスクしている)

$ sudo grep harukiya /etc/master.passwd 
パスワード:
harukiya:$1$xxxxxxxx:1001:1001::0:0::/home/harukiya:/usr/local/bin/bash
$ sudo cap_mkdb /etc/login.conf
$ sudo grep doe /etc/master.passwd 
harukiya:$1$xxxxxxx:1001:1001::0:0::/home/harukiya:/usr/local/bin/bash


で、passwdコマンドでパスワードを設定してやると、めでたく先頭が$6$に変化した。
(なおここではマスクしているが、実際にやってみるとハッシュがmd5に比べて長くなっていることが分かる)

$ passwd
Changing local password for harukiya
Old Password:
New Password:
Retype New Password:
$ sudo grep harukiya /etc/master.passwd 
harukiya:$6$xxxxxxxxxx:1001:1001::0:0::/home/harukiya:/usr/local/bin/bash


このままでもいいけど、せっかくだからblowfishに変更。/etc/login.confでsha512をblfへ。

        :passwd_format=blf:\


めでたくハッシュ先頭が$2a$に。

$ sudo cap_mkdb /etc/login.conf
$ passwd
Changing local password for harukiya
Old Password:
New Password:
Retype New Password:
$ sudo grep harukiya /etc/master.passwd 
harukiya:$2a$xxxxxxxxxx:1001:1001::0:0::/home/harukiya:/usr/local/bin/bash


もちろん、このあとrootのパスワードも設定しました。