1. Qiita
  2. 投稿
  3. Basic認証
  • 11
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

メジャーなWebサーバではBasic認証が使えるが、なんとなく弱いことは知っていた。
その挙動を勉強するためWiresharkを使って実験してみた。

サーバ情報

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

実験

1.リクエスト

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

2.401認証エラー

basic認証ありのページだということをクライアントに知らせるため、401を返す。
HTTPヘッダ内の
『WWW-Authenticate: Basic realm="Secret Zone"\r\n』
がBasic認証だということを表している。
realmはサーバ側で設定した認証が必要なエリアの名前。
basic2.JPG

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

HTTPヘッダ内の『Authorization: Basic YWRtaW46YWFh\r\n』
これがサーバに送信されているユーザ名+パスワードだ。
Wiresharkはコレを解読する機能を持っているようで、その下に『Credentials: admin:aaa』と表示されている。
確かにコレが入力したものだ。

※この解読機能は難しいものではなく、Base64でエンコードされているだけなので、LinuxのコマンドやWebサイトでデコードできる。
$echo YWRtaW46YWFh | base64 -d
admin:aaa

basic3_miss.JPG

4.間違えたらまた401

3では間違ったアカウントを入力したので、認証エラーとなり401がかえってくる。
basic4.JPG

5.正しい情報を送信

正しいアカウント情報を送信する
basic5_correct.JPG

6.200 OK

無事認証成功したので、200 OKが返ってくる。
basic6_ok.JPG

結果

basic認証はパケットキャプチャされる環境では平文と同じなので、危険。
設定も難しくないので、digest認証にするべし

.htpasswdの中身解説

$cat .htpasswd
admin:$apr1$vK0OgaPF$BYuV8aK/fjgn1PB7aahJJ/
adminはユーザ名
$apr1$はMD5のダイジェストというマーク
APRはApache Portable Runtimeの略。
$vK0OgaPF$の8文字(32bit)がsalt
『BYuV8aK/fjgn1PB7aahJJ/』はsalt + passwdを1000回繰り返したハッシュ値?
http://httpd.apache.org/docs/2.2/misc/password_encryptions.html (ソースへのリンクもあります)

参考文献

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