Digest認証

HTTPのベーシック認証はパスワードが平文で流れる。暗号化のためにはHTTPSにするのが一般的だと思うが、それができない場合にダイジェスト認証を使う。

ダイジェスト認証は以下のような流れで行われる。
(1)あらかじめWEBサーバにダイジェスト認証の設定をしておく
(2)クライアントはWEBブラウザで認証が行われるファイルに接続する。
(3)WEBサーバからクライアントに401 Unauthorizedを応答する。この応答の中でダイジェスト認証であることを示し、必要なパラメタを含めてクライアントに提示する。
(4)クライアントはID/パスワードを入力して送信する。WEBブラウザは必要なパスワードを含めた必要なパラメタを付加してハッシュ化し、WEBサーバに送信
(5)WEBサーバも受信したパラメタをもとにクライアントと同様にハッシュ化の処理を行い、受信したハッシュ値とWEBサーバで計算したハッシュ値が同じであれば認証を許可する。

主なパラメタはサーバから送るnonceとクライアントから送るcnonce。

WEBサーバ側は特にPHPなどのスクリプト処理は必要ない。
WEBサーバの仕様に合わせて設定するが、lolipopでは以下のように設定した。

#cd /testdir (以降も含めて全てフルパスで記載する。表記は省略している)

#htdigest -c /testdir/.htdigest ‘myarea’ secret (secretはユーザ名)
password:(パスワードを2回聞かれる)

#vi .htaccess(以下のように記載する。)
AuthType Digest
AuthName “myarea”
AuthUserFile /testdir/.htdigest
Require valid-user

実際のトラフィックは以下のようになる。

nonceはランダム値。MD5を使っている。ハッシュアルゴリズムに何を使うかは以下を参照して決めればいい。(レンタルサーバはサーバの仕様に従うしかない)
IETF文書(September 2015)
This specification defines the following algorithms:
o SHA2-256 (mandatory to implement)
o SHA2-512/256 (as a backup algorithm)
o MD5 (for backward compatibility).

MD5である事を気にするようなシステムはHTTPSを使えばいいのかもしれない。ダイジェスト認証はパスワードをハッシュ化して送るだけの仕組みなので、実際のHTTPデータが暗号化されるわけではない。用途に応じて検討する。

クライアントからの送信データにはcnonceが含まれている。これもランダム値。他のパラメタの詳細は別のサイトで調べられる。WEBブラウザもダイジェスト認証に対応している必要があるが、主要なWEBブラウザは対応していると思われる。