ようこそゲストさん

Magical Diary, beta version

[Perl] cryptの使い方

2007/07/18 20:13 HIRATA Yasuyuki

基本的な使い方

パスワードをハッシュして元の文字列を分からないようにしたい場合には、cryptを利用することが多い。DES が利用されるシステム (Unix系OSの多くではDESが標準) では、以下のように利用する。ここで、$salt には A-Z, a-z, 0-9, ".", "/" から無作為に2文字を抜き出して与える必要がある。(3文字目以降は無視される。) なお、この方法でcryptが生成する文字列 ($crypted_passwd) は先頭2文字がそのまま $salt となる。

$passwd ="moemoe"; # ユーザ入力を想定
$saltchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
           . "abcdefghijklmnopqrstuvwxyz"
           . "0123456789./";
$salt = substr($saltchars, int(rand length $saltchars), 1);
$salt .= substr($saltchars, int(rand length $saltchars), 1);
$crypted_passwd = crypt $passwd, $salt;
print "$passwd, $salt, $crypted_passwd\n";

実行結果:

moemoe, Ch, Che1un1w798gk

Cryptされたパスワード $crypted_passwd を元に入力されたパスワード $input_passwd を検証するためには、下記のように記述する。$crypted_passwdからわざわざ先頭2文字を抜き出してcryptの引数としているコードを見かけるが、後述する通りそのまま引数として渡すことで移植性が高くなる。

if(crypt($input_passwd, $crypted_passwd) eq $crypted_passwd) {
  print "passwd ok\n";
} else {
  print "invalid passwd\n";
}

MD5の場合

今まではDESを利用した場合について記載したが、OSによってはMD5などの要約関数が利用されている。その場合、出力される文字列はDESの場合と大幅に異なり、以下の通りとなる。

$1$salt$hashed_data

DESのみを想定してcryptされたパスワードの先頭2文字からsaltを得るように書かれたコードは、MD5を利用するシステムではそのまま利用できず、移植性が低下する。このため、移植性を考慮するのであれば、cryptの第2引数にはcryptされたデータそのものを与えることが望ましい

FreeBSDでは米国の暗号輸出制限のため、一時期まではDESが標準で組み込まれずにMD5を利用していた。現在では、暗号輸出制限の緩和により標準でDESを組み込んでいるが、互換性の観点からMD5も利用することが出来る。(MD5形式でsaltを与えた場合にはMD5が利用される。これにより過去のパスワードデータをそのまま利用することが可能である。)

なお、MD5のみが利用できる環境 (というのも今時は珍しいが) でDESを利用したい場合には、Crypt::UnixCrypt を利用することが出来る。Pure Perl 実装であるため、コンパイラが使えないレンタルサーバなどでも利用は容易だろう。

cryptは暗号化するのか

cryptでは暗号化するわけではなく、一方向性関数 (one-way function; 逆方向の計算が非常に難しい・不可能である関数) によって得られるデータを返すだけである。したがって、厳密な意味における "暗号化" ではない。また、計算によって "復号" することも出来ない。DESを利用している場合でも、これを暗号化のために利用しているわけではなく、単に一方向性の関数として利用しているだけである。

# BAK 2007年07月18日(水) 午後8時49分

そろそろ $2$ に新しいハッシュ関数が割り当てられたりしないのかしら.
MD5 も危なそげなので.

# HIRATA Yasuyuki 2007年07月18日(水) 午後9時00分

FreeBSDで man 3 crypt すると出てきますが、2 = Blowfish、3 = NT-Hash のようです。


#  非公開コメント   

  • TB-URL(確認後に公開)  http://diary.asuka.net/08/tb/
© 2007 HIRATA Yasuyuki <yasu@asuka.net>, all rights reserved