【推測】basic認証の仕組みをPHPで実現してみた
まずは、apacheでのbasic認証のやり方を説明してみます。
.htpasswdの生成
1 | htpasswd -c -b /path/.htpasswd user password |
htpasswdコマンドを打って、パス指定で.htpasswdファイルを作成できます。
「-c」は、createの意味で、.htpasswdファイルを新規作成します。
「-b」は、batchの意味で、コマンドラインで直接パスワードを指定します(ちょっと危ないですので、多用しないでほうがいいかもしりません)。
htpasswdコマンドが打てない方は、お手数ですが、ウェブサービスで「htpasswd 生成」で検索すれば、そういうツールが出てくるはずです。
.htaccessの設定
.htaccessに下記内容を追記。
1 2 3 4 5 | AuthUserFile /path/.htpasswd // .htpasswdファイルのパス AuthGroupFile /dev/null AuthName "Basic Auth" // basic認証ウィンドウのタイトル AuthType Basic require valid-user |
もちろう、httpd.confの設定権限を持っている方は、そちらで設定したほうがいいです。
basic認証の仕組み
apacheが.htpasswdファイルを見て、ユーザが入力したパスワードが正しいかを確認します。
これは案外複雑のプロセスです。
htpasswdコマンドの説明(man)をみたら、暗号化にはシステムのcrypt関数だけではなく、md5やsha1も使えます。
かつ、crypt関数では、暗号化するため、saltをランダムで作成するから、パスワードの認証が非常にややこしくなっています。
こちらのテストでわかりましたが、crypt関数ではsaltの最初の二桁しか使わないらしい(passは前の8桁しかみてない)です。
それをベースに、認証の仕組みを推測してみて、PHPで書いてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <?php $passwd = $argv[0];// user input $hashedPasswd = "...";// htpasswdで保存した暗号化されたパスワード $passwdOk = false; // cryptで暗号化してみる // saltは英字2桁 $salt = ""; $upperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; for ($i=1;$i<=strlen($upperCase);$i++) { $salt = substr($upperCase, $i-1, 1); for ($j=1;$j<=strlen($upperCase);$j++) { $salt .= substr($upperCase, $j-1, 1); if ($hashedPasswd == crypt($passwd, $salt)) { $passwdOk = true; break; } } } // md5で暗号化してみる if (!$passwdOk) { // ... } // sha1で暗号化してみる if (!$passwdOk) { // .... } // passwd OK後の処理 if ($passwdOk) { // ... } |
当たり前のことなんですが、自分で書いてみたらなんか膨大な感じをしますね。。
Author Profile
スターフィールド編集部
SHARE