質問: 会員制コミュニティサイトの、パスワードの自動生成プログラム・認証プログラムに関する質問です ■内容(全体の流れ) (1)メールアドレス等入力 (2)自動返信メールにて登録完了の通知 (3)パスワード申請urlにてパスワードを申請 (4)自動返信メールにて、パスワードを送付。 (5)ログイン画面で、ログインする。 (6)ログイン後は、会員専用のpdf文書がダウンロードできる。 この中の(5)で、正しいパスワードを入力しても「パスワードが間違っています」というエラー表示がでるようになりました。 ■問題解決に必要と思われる情報 1.パスワード生成は、 cgi standard input output library ver 3.36 2.不可逆のパスワード生成cryptを使っている? print file "$form{'mail'}:" . stdio'cryptstring($passwd) . ":" . time . ":" . time . "\n"; 3.レンタルサーバを変更したら問題が発生した。またパスワード記録ファイルの文字数が変わった。 問題なし:ギガバイズ http://saya.g--z.com/ xxxxxx@**.com:l/nloyyiasdi6:986364127:986364127 問題あり:cpi http://www.cpi.ad.jp/ xxxxxx@**.com:$1$ln$ibfsfm4u1koamoxxub5xh.:1109749957:1109749957 ※xxxxxx@**.comは、メールアドレス ※ロリポップレンタルサーバでも問題なく動作した。 5.ユーザーに送られてくるパスワードの文字数は、8文字。 例:d8dhy4iy (3で記載したcpiで生成された、ユーザーへ送られたパスワード) 私の推測では、サーバを変えたことによりパスワードの暗号化の方法が変わり、認証の際に登録時のパスワードと相違が発生しているのではないか、と考えています。 対処法お分かりになる方がいらっしゃいましたら教えてください。 どうぞよろしくお願い致します。
回答: > サーバを変えたことによりパスワードの暗号化の方法が変わり、・・・ まさにその通りです。 今回の場合、 cpiの方でcryptが吐き出しているのが$1$で始まるmd5ですね。 ギガバイズの方はdesです。 よって、両者が吐き出すcrypt後の文字列が異なるために「パスワードが間違っています」になってしまうのでしょう。 対処法としては、 ・どちらか一方に統一 ・crypt関数を使わず別の方法を採る の二つがあります。 前者の方は、サーバーの仕様による違いなのでどうしようもないですが、 desに統一する場合は、故 小塚 敦さんが作成されたライブラリを使用することができます。 http://mikeneko.creator.club.ne.jp/~lab/perl/des/ これを使った場合は、サーバーの環境を問わずdesで暗号化した形のものを常に取得することができます。 ただし、pureperlである分、通常のcrypt関数を使うときよりもサーバーへの負担は高いです。 (単発ならいいですが連続使用する場合は注意が必要です) 後者の方法としては、 ・各種ハッシュ関数を使ったハッシュにして扱う ・パスワードをそのまま(生のまま)扱う があります。 ハッシュで使う場合は、お馴染みのmd5、sha1をはじめとしてsha256、384、512やripemd160、256・・・等を使うことになります。 ただし、後者の二つは既存の記録ファイルから元のパスワードを導くことができないので、今回の場合は前者の「どちらかに統一」の方法を採ることになるでしょう。 (個人的なお奨めはハッシュを利用したものですが)