#ダイジェスト認証(RFC2617)とは
ダイジェスト認証とはHTTPの認証方式の一つ。BASIC認証と対比されることが多く、BASIC認証では防げない盗聴や改ざんを防ぐために考案されたもの。
ここでは簡単にダイジェスト認証について学んだので公開してみます。
※一般的にダイジェスト認証は、SSL/TLSを使用している場合にBASIC認証でも安全性は高いと言われているが、リスクヘッジの面で実装しておくとさらに安心です。
##パラメータ
下記パラメータをAuthorizationヘッダに入ります。
・username
・realm
・algorithm
・qop
・URI
・nonce
・cnonce
・nc
・response
(別途)
ヘッダには含まれませんが、passwordを用意しておく必要があります。
###username
ユーザー名。
###realm
認証領域。
###algorithm
ハッシュ関数(通常MD5)
###qop
Quality of protectionの略
authかauth-initが入り、auth-initの場合bodyもハッシュ計算に使用される。
###URI
URIまたはパス
###nonce
サーバ側から返すランダムな文字列
###cnonce
Client nonceの略(多分)
クライアント側で渡すランダムな文字列
###nc
同じnonceを使用する場合のカウント値
00000001 → 000000002
みたいな感じ
###response
ここがダイジェスト認証のキモ
ダイジェスト認証ではこのresponseが計算しにくいことでリプレイアタックなどの攻撃を防いでいるそうです。
下記計算方式
algorithum = MD5
qop = auth
とする。
A1 = username ":" realm ":" password
A2 = HTTPメソッド ":" URI
response = MD5(MD5(A1) ":" nonce ":" nc ":" cnonce ":" qop ":" MD5(A2))
##安全性
ダイジェスト認証では、上記のresponseが計算しにくいことで安全性を保っています。下記メリット例
★通信が盗聴されても、responseの値からpasswordを導き出すことはほぼ不可能
★見た目上はBASIC認証と変わらないので、認証方式がダイジェスト認証ということを隠すことができる。
(初回リクエスト時はBASIC認証と同じため)
★nonce,cnonceが常に変わる続けるため、もしどちらか一方がバレてもresponseはバレない
#ハッシュ方式について
現在はMD5では弱いという業界的な意見もあり、SHA-256を使用することが推奨されています。(RFC7616)