[スレッド全体]

[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