右も左もわからずLDAP認証なるものにチャレンジし始めた。OpenLDAP自体は入っていたので、perl用にNet::LDAPをインストール。SSL関係でエラーって入らなかったので、SSLなしでぶっこんでみた。
ハマったのはここから。パスワードの暗号化方式で、CRYPTとかMD5とかSLAはわかる。でも、SSLAとSMD5ってなんだ? 結論から言えば、MD5もしくはSLAにcryptと同様にSALT(塩)の文字列を用意して、Base64で固めた感じのもの。いつもと同様、英語が嫌だからと日本語だけで解説ページを探していたのに、実は英語の解説ページしかなくて大量の時間を浪費したと言うパターン。。。
具体的な認証の仕方。
- ハッシュ化されたパスワードを、Base64デコード。MD5なら始めの16byte、SHAなら20byteが実際のハッシュデータで、残りがSALT
- ユーザに入力されたパスワードに、1. のSALTをつけて、MD5(SHA)でハッシュ化
- 1.と2.を比較して、一致すればOK
use MIME::Base64;
use SHA;sub auth($$){
my ($pass, $hash_pass) = @_;
my ($hash_real, $salt) = unpack ("a20a*", decode_base64 ($hash_pass));
return SHA->new()->hash($pass, $salt) eq $hash_real;
}print "SSHA: ", auth('password', 'LdfshFhjkWnlt8j4KrLd65aFKgJskwFk5OpQ'), "\n";