#!/usr/local/bin/perl # パスワードを暗号化するのにcrypt()を3回コールして、 # 主なパスワード解読ツールでかなり解読されにくくする方法を説明したプログラムです。 # 暗号処理する流れを見るものであり、これだけで何かするものではありません。 # これを組み込むにはプログラミングの知識が必要です。by www.rescue.ne.jp # 元になるパスワード $FORM{'plain'} = "sT7%h$.s"; # 認証するパスワード $FORM{'password'} = "sT7%h$.s"; # どんなに暗号処理を複雑にしても、破られやすいパスワードを使わない、使わせないのが # 鉄則です。最低6文字以上、辞書にあるような単語や誕生日などの日付、その他推測され # やすいものを指定せず、できるだけ英字数字記号を混在させることが重要です。 #--------------------------------------------------------------------------------- print "Content-type: text/html\n\n"; print "

暗号化と照合の流れ

\n"; print "

\n"; # Salt値作成 # 任意の2文字を作成 @char = ('a'..'z','A'..'Z','0'..'9'); srand(time|$$); foreach (0..1) { { local(@temp); push(@temp,splice(@char,rand(@char),1)) while @char; @char = @temp; } $keisu = $char[($_)] . $keisu; } $now = time; ($p1,$p2) = unpack("C2",$keisu); $wk = $now / (60*60*24*7) + $p1 + $p2 - 8; @saltset = ('a'..'z','A'..'Z','0'..'9','/','%',';',',','='); $nsalt = $saltset[$wk % 64] . $saltset[$now % 64]; # 第一暗号処理 $crypt1 = crypt($FORM{'plain'},$nsalt); # 第二暗号処理 # (第一暗号そのものをさらに暗号処理する) # (ここでは第一暗号の後ろ2文字をSalt値を使っている) # # ※ Salt値は2文字が取得できればどの場所からでもよい→これをあなた独自に設定して非公開にし、 # 第三第四と任意の回数処理すれば、さらに解読するソフトの設計をより困難にすることになる。 $crypt2 = crypt($crypt1,substr($crypt1,-2,2)); # 第三暗号処理(最終暗号) # (第一暗号処理時と同じSalt値を使う) $passwd = crypt($crypt2,$nsalt); print <<"EOM"; 元パスワード:$FORM{'plain'}

SALT値:$nsalt
第一暗号(中間値):$crypt1
第二暗号(中間値):$crypt2
暗号:$passwd

EOM # 以上が元パスワードを暗号化するまでの処理です。 # この暗号が、認証するパスワードで認証されるかどうかを確認します。 # 認証するパスワードを同じ手順で暗号化し、合致するかどうか確認します。 # Salt値は標準DESの場合は頭2文字、FreeBSD-MD5は$1$に続く2文字に記録されています。 # 暗号文を暗号化した時に使ったSalt値を取得する if ($passwd =~ /^\$1\$/) { $salt = 3; } else { $salt = 0; } $nsalt = substr($passwd,$salt,2); # このSalt値を使って同じ手順で暗号処理する # (当然、同じ手段で暗号化していないものは認証されません) $crypt1 = crypt($FORM{'password'},$nsalt); $crypt2 = crypt($crypt1,substr($crypt1,-2,2)); $passwd2 = crypt($crypt2,$nsalt); print <<"EOM"; 認証パスワード:$FORM{'password'}

オフセット値(Standard-DES=0,FreeBSD-MD5=3):$salt
暗号から得たSALT値:$nsalt
第一暗号(中間値):$crypt1
第二暗号(中間値):$crypt2
認証パスワードを暗号化したもの:$passwd2

EOM if ($passwd eq $passwd2) { $result = 'OK'; } else { $result = 'NG'; } print <<"EOM"; 照合結果:$result

EOM exit; # [参考文献] # Perlプログラミング O'REILLY ISBN4-900900-48-6 # [Credit] # 佛教大学@内藤三義さんにアドバイスいただきました.