Digest認証 【digest authentication】 HTTPダイジェスト認証
概要
Digest認証(digest authentication)とは、HTTPでユーザー認証を行う標準仕様の一つで、認証情報をハッシュ化して送受信する方式。データの伝送経路上で第三者に盗み見されてもパスワードなどを盗み取られることを防ぐことができる。Webコンテンツを送受信するプロトコル(通信規約)であるHTTP(Hypertext Transfer Protocol)には、特定のリソース(ファイルやフォルダなど)へのアクセスを一部のユーザーに制限し、アクセスを試みた際にユーザー認証を行う仕組みが定義されている。
Digest認証はそのようなHTTP認証の手順の一つで、ユーザー名やパスワードなど認証のために必要な情報をそのまま送らず、ハッシュ関数により算出したハッシュ値のみを送る。ハッシュ値から元になった値を効率よく推測することはできないようになっており、攻撃者がやり取りを盗聴しても認証情報を取得することはできない。
認証手順
Webサーバは認証が必要な領域へのアクセスを受けると、Webブラウザへ401エラーを返して認証要求を通知し、「nonce」(ナンス)と呼ばれるランダムな文字列を生成して送信する。ブラウザは利用者にユーザー名とパスワードの入力を要求する。
ブラウザは入力された認証情報と、サーバから受領したnonce、自ら生成したランダムな値「cnonce」(client nonce)を連結し、ハッシュ関数でハッシュ化する。サーバへはcnonceと算出したハッシュ値を送信する。サーバ側では保存されたユーザー名とパスワード、nonce、cnonceで同様のハッシュ値を算出し、一致すれば認証成功となる。
ユーザー名とパスワードのみをハッシュ化すると毎回同じハッシュ値をやり取りすることになるため、通信を盗み見た攻撃者がハッシュ値をサーバに送信してクライアント側になりすます反射攻撃が可能となってしまうが、ランダムなnonceとcnonceを追加することで、毎回異なるハッシュ値としている。
ハッシュ関数の種類はHTTPヘッダの中で指定することができ、双方が対応しているアルゴリズムが採用される。当初の規格(RFC 2617)ではMD5方式が用いられていたが、現在では十分な安全性が確保できないことが知られており、改訂版(RFC 7616)ではSHA-256の使用が推奨されている。
他方式との比較
Digest認証は認証情報を平文のまま送受信するBasic認証(基本認証)に比べ、クライアントとサーバ間の伝送路の安全が確保されていない状況で認証情報を保護することができる。現代ではSSL/TLSを用いてHTTPによるデータ伝送全体を暗号化するHTTPS通信が広く普及しており、かつてより重要性は低下している。