暗号化した通信はtcpdumpでどう見えるか
APOPのパスワード暗号化手順
通信パケットを盗聴された場合でも自分のパスワードを知られないようにする方法として、まずパスワードを暗号化することが検討されました。メールの受信(POP3)では、この認証方法をAPOPと呼んでいます。
APOP認証は、チャレンジ/レスポンスと呼ばれる方式を用いることによってパスワードを暗号化し、第三者から通信パケットを盗聴されたとしても、そこから第三者がパスワードが解読することはできないようになっています。チャレンジ/レスポンス方式とは、サーバーから受信した文字列(チャレンジ)とパスワードを組み合わせたものに対して何らかの演算処理を行い、その結果(レスポンス)をサーバーへ送信する方式です。APOP認証においては、演算処理にはMD5(http://www.faqs.org/rfcs/rfc1321.html)が用いられています。
MD5はハッシュ関数(不可逆な一方向関数)であるため、仮に第三者が通信パケットを盗聴することによってハッシュ値を取得することができたとしても、その値から元のパスワードを解読することはできません(非常に困難である)。
また、POP3サーバーから送信されるチャレンジ文字列は、クライアントが接続するたびに変化するため、盗聴したハッシュ値をそのまま利用することもできません(このため、チャレンジ/レスポンス方式で生成される値はワンタイムパスワードと呼ばれています)。この仕組みを用いることによって、POP3はパスワードの漏えいを防止しています。
サーバー/クライアント間におけるAPOPを用いた認証手順は、以下のようになります。
1.クライアントがPOP3サーバーに接続すると、サーバーは(APOP をサポートしていることが前提)チャレンジ文字列と呼ばれる文字列をクライアントへ送信する。
2.クライアントは、受信したチャレンジ文字列とパスワードを連結して、その文字列のMD5ハッシュ値を計算する。クライアントは、このハッシュ値をパスワードとして、ユーザー名とともにサーバーへ送信する。
3.サーバーもクライアントへ送信したチャレンジ文字列とサーバーに保存されているユーザーのパスワードを用いて、クライアントと同様の方法でMD5ハッシュ値を計算する。サーバーは、自らが計算したハッシュ値とクライアントから送信されたハッシュ値を比較することによって認証処理を行う。
tcpdumpで通信内容を見てみる
最後に、tcpdumpを使って、APOP 認証を用いてメールの受信を行っている通信の様子を閲覧してみます。
図2-1のサンプルプログラムは、図1-1の最新の受信メールの内容を表示させるサンプルプログラムにAPOP認証を行う処理を追加したものです。また、図2-2はtcpdumpを用いて、図2-1のサンプルプログラムを実行したときの通信内容を表示させた結果の一部(パスワードの送受信部分)を表しています。図2-2を見ると、ユーザー名は依然として容易に取得することができますが、パスワードの部分は解読できない文字列に暗号化されていることが分かります。
HTTPやSMTPなどほかのプロトコルにおいても、暗号化の手順や使用するハッシュ関数など詳細部分に違いはありますが、基本的にはAPOPと同じような方法でパスワードを暗号化し、認証を行うための方法が提供されています。
次は経路上の通信を暗号化する方式について解説します。