Pixel Pedals of Tomakomai

北海道苫小牧市出身の初老の日常

LDAPで認証?

右も左もわからずLDAP認証なるものにチャレンジし始めた。OpenLDAP自体は入っていたので、perl用にNet::LDAPをインストール。SSL関係でエラーって入らなかったので、SSLなしでぶっこんでみた。



ハマったのはここから。パスワードの暗号化方式で、CRYPTとかMD5とかSLAはわかる。でも、SSLAとSMD5ってなんだ? 結論から言えば、MD5もしくはSLAにcryptと同様にSALT(塩)の文字列を用意して、Base64で固めた感じのもの。いつもと同様、英語が嫌だからと日本語だけで解説ページを探していたのに、実は英語の解説ページしかなくて大量の時間を浪費したと言うパターン。。。

具体的な認証の仕方。

  1. ハッシュ化されたパスワードを、Base64デコード。MD5なら始めの16byte、SHAなら20byteが実際のハッシュデータで、残りがSALT
  2. ユーザに入力されたパスワードに、1. のSALTをつけて、MD5(SHA)でハッシュ化
  3. 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";