• 22
    Like
  • 0
    Comment
More than 1 year has passed since last update.

Digest認証がBasic認証よりどの程度強固なのか確認したく、実験した。

サーバ情報

クライアント:192.168.0.2
サーバ:192.168.0.5
アカウント:admin/admin

実験

1.リクエスト

この時、クライアントは認証ありのページなのか、認証なしのページなのか知らないので、通常のリクエストを送る。
digest_1.JPG

2.401認証エラー

digest認証ありのページだということをクライアントに知らせるため、401を返す。
HTTPヘッダ内の
『WWW-Authenticate: Digest realm="secret", nonce="35BgQjIPBQA=5014d9d750424666921e3e9007bd102dc4d3f2bc", algorithm=MD5, qop="auth"\r\n』
がdigest認証だということを表している。
realmはサーバ側で設定した認証が必要なエリアの名前。
nonceはサーバ側が生成したランダムな文字列
algorithmはハッシュに使う関数
qopは「Quality of protection」の略で、authかauth-initが入る。digestを作る際にbodyを含めるかどうか。
digest_2.JPG

3.アカウント情報の入力

digeset_miss.JPG

HTTPヘッダ内の


Authorization: Digest username="admin", realm="secret", nonce="35BgQjIPBQA=5014d9d750424666921e3e9007bd102dc4d3f2bc", uri="/", algorithm=MD5, response="afb7a95eb81ffe8a3877e968b34db8e9", qop=auth, nc=00000001, cnonce="9c1d4392e7611e41"』
が送信されているアカウント情報。
cnonceはクライアント側で生成したランダムな文字列
ncはカウント、responseは以下の式で導かれる。

A1 = ユーザ名 ":" realm ":" パスワード
A2 = HTTPのメソッド ":" コンテンツのURI
response = MD5( MD5(A1) ":" nonce ":" nc ":" cnonce ":" qop ":" MD5(A2) )

(wikipediaより引用)
digest認証はこのresponseが導き出しにくいことでセキュリティを保っている。

4.間違えたらまた401

digest_4.JPG
この時のnonceに注目。
先ほどは「nonce="35BgQjIPBQA=5014d9d750424666921e3e9007bd102dc4d3f2bc"」だったが今回は「nonce="oN+ZQjIPBQA=385ddf7fda0f6206b9dcb15c2de45d060132eb40"」だ。
つまり、認証画面が出るたびにこの値は変わる。
このため、responseなどの各種値を入手しても次のタイミングには使えない。
もちろん、cnonceも送信するたびに変化する

結果

responseの値が導き出すことはとても困難(MD5のハッシュ値から元に戻す必要がある)だと分かった。
http://md5cracker.org/
などでMD5→元の文字列へ変換できるので、MD5は無効化されたかとも思ったが、そんなことはなかった。

参考文献

wikipedia, Digest認証
http://ja.wikipedia.org/wiki/Digest%E8%AA%8D%E8%A8%BC