[▲前のスレッド]

[18] crypt関数 
2001/6/30 (Sat) 04:25:12 - あけび
サーバによって使えるタイプはまちまちですが、
私が今まで使ってきたサーバで
以下の5タイプを実際に確認しています。

DES専用(1)
crypt('test','aa') = 'aaqPiZY5xR5l.'
crypt('test','$1$aa$') = '$1SoNol0Ye6Xk'

DES専用(2)
crypt('test','aa') = 'aaqPiZY5xR5l.'
crypt('test','$1$aa$') = '$19JEJTylB1.M'

MD5専用(1)
crypt('test','aa') = '$1$aa$4OSUA5cjdx0RUQ08opV27/'
crypt('test','$1$aa$') = '$1$aa$4OSUA5cjdx0RUQ08opV27/'

MD5専用(2)
crypt('test','aa') = ''
crypt('test','$1$aa$') = '$1$aa$4OSUA5cjdx0RUQ08opV27/'

DES/MD5両用
crypt('test','aa') = 'aaqPiZY5xR5l.'
crypt('test','$1$aa$') = '$1$aa$4OSUA5cjdx0RUQ08opV27/'

Cyclamen BBS では、上記のいずれの場合でも使用できるよう
(MD5が使える場合はそちらを優先して)
エンコード/照合ルーチンを組んでいます。


[19] crypt関数を使った暗号化/照合のサンプル 
2001/7/3 (Tue) 11:17:21 - あけび
# MD5ではsaltは$1$〜$で挟まれた0〜8文字。9文字目以降は切り捨てられる。
# DESではsaltは2文字。3文字目以降は切り捨てられる。
# MD5ではcrypt関数にsaltを渡す場合、先頭に$1$を付けなければ値の返らないサーバあり。
# DES/MD5両用サーバでは、crypt関数にsaltを渡す場合、先頭に$1$を付ければMD5、付けなければDESで値が返る。
# DES/MD5どちらの場合でも、照合時には暗号化された文字列をそのままsaltとして渡せばよい。わざわざsalt部分を抜き出す必要はない。

などの条件を加味して組んだperl用crypt暗号化/照合ルーチン。
DES/MD5両用サーバではMD5が適用されます。
crypt関数の使えないサーバでは使用できません。


# 暗号化
# 引数:パスワード平文
# 戻り値:暗号化された文字列
# 使用例:$pass = &enc_crypt('PassWord');
sub enc_crypt {
    local($plain) = @_;
    local($s) = '';
    local(@salt) = ('0'..'9','A'..'Z','a'..'z','.','/');
    srand;
    1 while (length($s .= $salt[rand(@salt)]) < 8);
    crypt($plain,index(crypt('a','$1$a$'),'$1$a$') == 0 ? '$1$'.$s.'$' : $s);
}

# 照合
# 引数:パスワード平文,暗号化された文字列
# 戻り値:一致=真 不一致または入力不備=偽
# 使用例:&check_crypt('PassWord',$pass) ? '一致' : '不一致'
sub check_crypt {
    local($plain,$crypt) = @_;
    ($plain ne '' && $crypt ne '' && crypt($plain,$crypt) eq $crypt);
}

[▼次のスレッド]
INCM/CMT
Cyclamen v3.84.01