Salted MD5 (CRYPT MD5) ハッシュの生成 [Ruby, Perl, C言語]

先日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ではまた別な記述だったので、本当にシステムによって実装が違うということがよくわかる。

関連記事

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です