図1 HTTP Mutialアクセス認証はHTTPに組み込まれる安全な認証方法
図1 HTTP Mutialアクセス認証はHTTPに組み込まれる安全な認証方法
[画像のクリックで拡大表示]
図2 Mutual認証のやりとり
図2 Mutual認証のやりとり
[画像のクリックで拡大表示]

 HTTP Mutualアクセス認証(Mutual認証)とは,サーバーとブラウザが相互認証してフィッシングを防ぐ新しい認証のしくみのこと。経済産業省系の独立行政法人である産業技術総合研究所が開発し,IETFに提案中のプロトコルである。2008年6月から,Yahoo!オークションでHTTP Mutualアクセス認証の公開実証実験が始まっている。

 HTTP Mutualアクセス認証は,HTTPの標準機能に組み込む認証プロトコル。Webサーバー,Webブラウザの双方でMutual認証に対応することで実現する(図1)。産業技術総合研究所は実証実験に先立ち,WebブラウザとしてFireFoxを拡張した「MutualTestFox」を用意。6月から始まった公開実証実験では,Yahoo! JAPAN が公開テスト用ブラウザとして「Lunascape for Yahoo!オークション バージョン2.0」を公開している。

 Mutual認証対応ブラウザから対応Webサーバーにアクセスすると,アドレス・バーの隣にユーザーIDとパスワードを入力するフィールドが表れる。ユーザーがIDとパスワードを入力して相互認証が成功すると,認証中であることがアイコンで表示される。

 Mutual認証の特徴は三つある。それは,(1)パスワードを送らない,(2)ブラウザがサーバーを認証できる,(3)中間者攻撃を防ぐ──だ。パスワードをやりとりせずに,サーバーとブラウザが共通のパスワードを持っていることを検証する。パスワードを送らないため,クラッカが認証でやりとりする情報を盗み見てもパスワードが漏れない。

 また,偽サーバーに誘導して情報を収集するフィッシングにも強い。偽サーバーが正規サーバーの代わりになって情報を受け取っても,パスワードはわからないからだ。さらに,サーバーがブラウザ側を認証するだけでなく,ブラウザもサーバーが正しいパスワードを持っていることを確認できるため,偽サイトにアクセスしていることが,ユーザーにわかるようになっている。

 偽サーバーがブラウザから受け取った認証情報を正規サーバーに転送する,「中間者攻撃」も防げる。Mutual認証では,認証情報にアクセス先Web サーバーのドメイン名を組み込む。偽サーバーにアクセスするときは認証情報に偽サーバーのドメイン名が組み込まれるので,偽サーバーが正規サーバーに転送しても認証は成功しない。

 つまりユーザーは,アドレス・バーの隣のMutual認証用のフィールドでユーザーIDとパスワードを入力する限り,安心してWebアクセスできるわけだ。

 次にMutual認証のやりとりを見てみよう(図2)。Mutual認証でサーバーとブラウザは,パスワードを基に共通の認証用情報を作り出す。この認証用情報が一致することを互いに確認し合う。

 WebブラウザがMutual認証の必要なサイトにアクセスすると,WebサーバーからMutual認証を使うことを指示する応答が送られてくる。ブラウザは,ここでIDとパスワードを入力するフィールドを表示する。

 ユーザーからのIDとパスワードの入力を受け付けたブラウザは,まず乱数から認証用情報のタネ「α」を生成して,IDとともに送信する(図2の(1))。α とIDを受け取ったサーバーは,ユーザーのパスワードと,自分のドメイン名,乱数,αを基に,認証用情報のタネ「β」を生成して送る(同(2))。

 同時にサーバーは,βと乱数から認証用情報「γ」を完成させる(同(3))。一方,サーバーから認証用情報のタネβを受け取ったブラウザは,βにαを作るときに使った乱数とパスワード,ドメイン名を組み合わせてγを生成する。

 ここまでで,同じ認証用情報がサーバーとブラウザの双方で生成できる。認証用情報を完成させるには,認証用情報のタネを作るときに使った乱数が必要なので,タネを盗み見しただけでは認証用情報が生成できないしくみだ。

 こうして生成した認証用情報が一致すれば,互いの認証が完了する。

 次にブラウザは,認証用情報γに使い捨ての数字「A」を組み合わせてハッシュ「a」を取り,Aとaを送信する(同(4))。サーバーは,Aとγからハッシュをとって,aと一致することを確認することでクライアントを認証する(同(5))。

 最後にサーバーは,γと使い捨ての数字Aから別のハッシュbを生成してブラウザに送信する(同(6))。クライアントでも同様に計算してサーバーを認証する(同(7))。

 サーバーとクライアントが生成した認証用情報γは,複数のWebページへのアクセスで共通のものを使用する。認証情報を生成するのは,サーバーにとってもクライアントにとっても複雑で重たい処理になる。このため認証用情報は,ユーザーがIDとパスワードを入力したときに1回生成し,あとはユーザーがログアウト・ボタンを押すまで使い続けるしくみだ。使い捨ての数字をWebページのアクセスごとに変えることで,盗聴されても悪用されないようにしている。