Basic認証とDigest認証の手順を学習してみる

2009 年 10 月 17 日 | カテゴリー: Apache, LAMP奮闘記

HTMLフォームからのID/Passwordによるログインや、OpenIDを利用してのログイン等が主流で、あまり目にする(&実装する)機会の無い認証方法なので手順をなかなか覚えきれません><

というワケで、以下それぞれの手順をメモしておきます。

Basic認証

ブラウザのダイアログが出て「ユーザー名・パスワード」を要求されるアレですね。認証をかけたいディレクトリに.htaccessを置く必要があるので、.htaccessが利用可能である事が前提です。

まずは、照合用の.htpasswdファイルを作成。言わずもがなですが、公開ディレクトリより上層に配置します。シェルで以下のコマンドを実行します。

;; 公開ディレクトリが/var/www/htmlなので
# htpasswd -b -c /var/www/.htpasswd ユーザー名 パスワード

「-b」オプションで、端末から入力したパスワードを利用出来るようです。ただし、コマンド入力時にパスワードが丸見えなので気をつけなさい!!みたいな事がmanに書いてありました。

「-c」オプションは新規ファイル生成(create)なので、認証ユーザーを追加したい場合には不要のようです。取りあえず上記のコマンドで、「hoge」ユーザーのパスワード「hogehoge」を作成してみました。

で、次に認証をかけたいディレクトリ下に.htaccessファイルを配置します。取りあえずローカル環境でのテストなので、公開ディレクトリ以下全てを認証制にしてみます。.htaccessの内容はこんな感じです。

AuthUserFile /var/www/.htpasswd
AuthName "Input ID and password"
AuthType Basic
require valid-user

ポイントは「.htpasswdのパスは絶対パスで記述する」という点でしょうか。AuthNameに記述した内容がダイアログに表示されます。

Basic認証は、認証情報がリクエスト毎に送信され、尚かつその情報が暗号化ではなくbase64による「符号化」でしかない為、実質平文のID・パスワードがネットワーク上に流れるのであまりセキュアな方法とは言えないようです。

Firebugでリクエストヘッダを見てみると、以下の情報が送信されています。

Authorization  Basic aG9nZTpob2dlaG9nZQ==

この文字列をPHPのbase64_decode()関数などに与えてみると…

$ php -a
php > echo base64_decode("aG9nZTpob2dlaG9nZQ==");
php > hoge:hogehoge

と、ユーザー名/パスワードがあっさり分かってしまいました。

そこで、次のDigest認証が推奨されています。

Digest認証

こちらの認証方法はBasic認証とほとんど同様のようですので、まずは照合用の.htdigestファイルを作成します。

# htdigest -c /var/www/.htdigest レルム ユーザー名
Adding password for hoge in realm Secret Area.
New password: [パスワード応答]
Re-type new password: [パスワード応答]

「レルム」というのは、.htaccessファイルに記述する「AuthName」と同一である必要があります。ここがBasic認証とは違いますね。

で、.htaccessは以下のようになります。

AuthType Digest
AuthName "Secret Area"
AuthDigestDomain /
AuthUserFile /var/www/.htdigest
require valid-user

「AuthType」が「Digest」になる点と、前述のように「AuthName」の意味合いが変わる事ぐらいでしょうか。

続いてこの場合のリクエストヘッダを見てみると、以下のような情報が送信されていました。

Authorization  Digest
username="hoge",
realm="Secret Area",
nonce="QlGMVhl2BAA=d7dd8bd6c5659d1efd515d79ed699ab1d694e99d",
uri="/",
algorithm=MD5,
response="afc54b31313e200977dcc5c0721d39bb",
qop=auth,
nc=00000006,
cnonce="303473c2c65228c6"

「algorithm=MD5」とありますので、認証情報が暗号化されて送信されているようです。この辺りが、Basic認証の代わりに推奨される理由でしょうか。


色々と調べてみると、Basic認証では「-b」オプションが無くても良かったり、Basic認証でも暗号化が利用出来たり、とまだまだ勉強する事がありそうですが、最低限の知識としては今の所これで充分かな??と思います。

今日はここまで。

  1. paz
    2009 年 10 月 18 日 00:36

    Basic認証、非常に勉強になりました!
    仕事で昔の案件案件を担当するとよく利用されているんですが、Basic認証が「よくない」理由がはっきりと認識できました・・・
    このエントリを参考に体制をかえていかないと!!

  2. taro
    2009 年 10 月 18 日 15:09

    >pazサン

    コンニチハ

    いつもpazサンのエントリで勉強させてもらってばかりなので、お役に立てたなら何よりです^^
    一応ローカル環境で検証していますが、嘘ついてたら遠慮なくつっこんでください。

    ネットワーク上の通信とかになるとTCP/IPも勉強しないとイケナイですよね。
    課題盛りだくさんですが、楽しそうなのでちゃんと身に付けたいです!!