PTKは以下の5つの要素から生成されることができます。両者が共通のPMKを持っている状態から共通のPTKを得るためには、これらの情報を交換する必要があります。handshakeで交換されるのは、5つの要素のうちAnonceとSnonceです。他はその前に共有されているからです。PMKはPSKとして既に両者で共有されている、あるいは、認証サーバから両者に与えられていますね。MACアドレスについては、そもそもhandshakeを開始する時点で分かっていないと通信できません。(WPA2の認証・暗号化の話はOSIモデルのデータリンク層での話なので、お互いのMACアドレスは知っていないといけません。ちなみに、clientにIPアドレスは割り当てられていません。Commonsから引用したものです。MICとは改ざん検出用のコードです。このようにして共有したPTKを用いて、clientとAPは暗号化された通信を開始します。ここで重要なことは、同じPMKを持つclientでもnonceが異なるためPTKは異なるということです。WPA-PSK方式では全てのclientが同じPMKを持つことになりますが、それでも実際に暗号化で使われるkeyであるPTKは異なるのです。それなら安心です、良かったですね、とはなりません。handshakeが安全でないからです。handshakeの通信は暗号化されていません。handshake開始時点で、clientとAPは共通鍵の交換を終えていないからです。したがって、攻撃者はAnonceとSnonceを容易に得ることができます。この点については、WPA2-PSKとWPA2-EAPで変わりません。どちらも安全性は変わらないのでしょうか。PMKは知られていないことが前提しかし、公衆無線LANのケースでは両者に大きな違いがあります。WPA2-PSKでは攻撃者がPMK(=PSK)を得ることは容易です。それはしばしば掲示されているからです。WPA2-EAPではclientごとにPMKは異なる(ことができる)ので、攻撃者がPMKを得ることは必ずしも容易でありません。PMKが知られていなければ、MACアドレスとnonceが知られていてもPTKを知られることはありません。PMKは正規のユーザー以外に知られていないことが前提なのです。家庭用無線LANルーターがWPA2-PSKを採用するのは、ルーターの側面にある文字列なんかを知っているのは正規のユーザーしかいないだろうという前提があるからなのですね。SSL/TLSがあるから大丈夫こういう話をすると公衆無線LANを使うのが怖くなってしまうかもしれないのですが、実のところそこまで心配する必要はありません。この暗号化が破られたところで大した影響のない場合が多いからです。最近のWebではclientとserverの通信のほとんどがSSL/TLSを用いて暗号化されています。この暗号化はアプリケーション層(あたり)の話ですよね。WPA2のようなデータリンク層で暗号化が破られても、より上の層で大きな壁があるので問題ないと考えられます。古いWebページでSSL/TLSによる暗号化がされていない場合はその内容が盗聴されうるということに留意しておく必要があります。公衆Wi-Fiはどのような場合に安全か以下のいずれかに当てはまれば安全だと考えます。適切な運用がされている場合、という話になりますが。(ネットワーク層での暗号化)最後に私も勉強しながらこの記事を書いたので、間違っている所があればTwitterなどで教えていただけるとありがたいです。セキュリティは難しいけど、その精巧な仕組みには感動します。記事一覧へコメントフォームは設置していませんので、ご意見・ご感想などはTwitter(@cosnomi)などへお願いします。