先日PHPで生成していたSalted MD5をRubyでも出来てないのは
寝覚めが悪いと言うことでRubyで生成する方法を調べてみた。
PHPでの生成方法: Salted MD5 (CRYPT MD5) ハッシュの生成 [PHP]
Mac OS Xでなんとか試してみていたけど、うまくいかなかった。
どうも、Mac OS Xのcrypt(3)では標準のDESだけでMD5をサポートしていないらしい。
Rubyのcryptはライブラリのcrypt(3)を実行しているので
システムによってMD5を利用できないようだ。
そこで、CentOS5.5で実行してみるとうまくいった。
またちょっと古いけれどもFreeBSD 6.1でも大丈夫だった。
irb> "password".crypt("$1$hv9t/Syk$") => "$1$hv9t/Syk$HnXkC52c9l6VJ5x.vSe8P."
Stringのcryptメソッドに”$1$”で始まるsaltを渡して
あげればよい。
saltの最後の”$”はオプションであってもなくてもよい。
この場合saltは”password”という文字列を
8文字のsalt”hv9t/Syk”を使ってMD5ベースの
ハッシュを生成している。
ちなみにPerlも大して変わらない。
print crypt('password', '$1$hv9t/Syk$');
C言語ならこんな感じ。
#include <stdio.h> #include <unistd.h> int main(){ printf("%s\n",crypt("password","$1$hv9t/Syk$")); return 0; }
実際にはRubyでもC言語のcrypt関数が使われてるのでRubyの結果と同じだ。
参考記事: [ruby-list:28426] Re: crypt
CentOSでコンパイルするにはライブラリへのリンク(-lcrypt)を指定する必要がある。
$gcc crypt.c -lcrypt -o crypt $./crypt $1$hv9t/Syk$HnXkC52c9l6VJ5x.vSe8P.
現在利用しているシステムでMD5を利用できるかどうかは
manコマンドで判断できそうだ。
$man 3 crypt
MacのmanにはMD5についての記述はないけれども
CentOS, FreeBSDには記述がある。
CentOSの場合
The glibc2 version of this function has the following additional features. If salt is a
character string starting with the three characters “$1$” followed by at most eight charac-
ters, and optionally terminated by “$”, then instead of using the DES machine, the glibc
crypt function uses an MD5-based algorithm, and outputs up to 34 bytes, namely
“$1$$”, where “ ” stands for the up to 8 characters following “$1$” in the
salt, followed by 22 bytes chosen from the set [a–zA–Z0–9./]. The entire key is significant
here (instead of only the first 8 bytes).
FreeBSDではまた別な記述だったので、本当にシステムによって実装が違うということがよくわかる。