- ベストアンサー
会員制コミュニティサイトの、パスワードの自動生成プログラム・認証プログラムに関する質問です
■内容(全体の流れ) (1)メールアドレス等入力 (2)自動返信メールにて登録完了の通知 (3)パスワード申請URLにてパスワードを申請 (4)自動返信メールにて、パスワードを送付。 (5)ログイン画面で、ログインする。 (6)ログイン後は、会員専用のPDF文書がダウンロードできる。 この中の(5)で、正しいパスワードを入力しても「パスワードが間違っています」というエラー表示がでるようになりました。 ■問題解決に必要と思われる情報 1.パスワード生成は、<stdio.pl> 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で生成された、ユーザーへ送られたパスワード) 私の推測では、サーバを変えたことによりパスワードの暗号化の方法が変わり、認証の際に登録時のパスワードと相違が発生しているのではないか、と考えています。 対処法お分かりになる方がいらっしゃいましたら教えてください。 どうぞよろしくお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> サーバを変えたことによりパスワードの暗号化の方法が変わり、・・・ まさにその通りです。 今回の場合、 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・・・等を使うことになります。 ただし、後者の二つは既存の記録ファイルから元のパスワードを導くことができないので、今回の場合は前者の「どちらかに統一」の方法を採ることになるでしょう。 (個人的なお奨めはハッシュを利用したものですが)
その他の回答 (1)
- steel_gray
- ベストアンサー率66% (1052/1578)
問題の原因は推測どおりサーバによる違いです。 参考URL1 stdio'CryptString の中身までみていませんが、 検索してみたところ、cryptがMD5で動作する環境でDES方式の暗号化を行うライブラリ(参考URL2)がありましたので、crypt関数を使っている部分をこのモジュールに差し替えればうまく動きそうな気がします。