P2Pアプリのネゴシエーション
さて、本題に入る前に頂いたコメントを紹介します。
まずはP2P-CDNの研究をされている市川様から分散ハッシュの文献の紹介です。
Loking up data in P2P systems
ページの下の方で日本語に訳されたPDFもあるのでご安心を。分散ハッシュについて丁寧に説明してあります。
次に、昨日のBlog「中間侵入攻撃」について、ながせあきひろ氏のコメントです。
Re:中間侵入攻撃
確かに昨日書いたようにハッシュ値でなく、公開鍵を掲示板で公開してもレベルは同じですね。それよりも秘密鍵でNameを署名すると言う考え方はスマートです。コメントありがとうございました!
では本題に入ります。P2Pアプリ間の通信を暗号化する際、公開鍵等を使う場合、鍵交換のネゴシエーションが発生します。このネゴシエーションはSSLだと平文に書かれてしまっているので、L7SWがあればネゴシエーション自体を検出し、P2Pアプリ間の通信をストップさせることが可能です。では、このネゴシエーションを暗号化できないでしょうか?
まず、P2Pアプリ内に共通鍵Kがあるとします。Kはリバースエンジニア等でわからないように慎重にプログラミングを設計する必要があります。では、ネゴシエーションでKを使って暗号化すれば良いのでは、と考えますがそれだけでは不十分です。なぜならば一般にネゴシエーションの命令、順序は決まっているからです。つまり、最初のネゴシエーションの指示をcomannd1とします。暗号化するとK(command1)なので、この暗号化されたパケットをK(command1)検出すればP2Pアプリの通信をストップさせることが可能です。
そこでMIX-netで使われるpaddingを応用しましょう。paddingは「詰め物」という意味です。今、通信したい命令をcommandとします。データの長さを返す関数をLengthとしましょう。また、乱数Rを発生します。c=Length(command)、r=Length(R)とします。文字の置換をする関数Tにおいて、t=T(c+r,command,R)を計算します。さて、パケットの中身ですが、 最初のNビットでcを記述します。次のNビットでrを記述します。その後は可変長(c+rビット)でtを記述します。そのパケットを共通鍵Kで暗号化します。こうすれば、毎回同じcommandを使っていても暗号文は異なります。このため、同じ共通鍵を使ってもなかなか通信内容がわからないことになります。
これでネゴシエーションの時でもL7SWがそれを検出するのが困難になります。
「P2P」カテゴリの記事
- [P2P]Websocketでブラウザ間P2P通信は実現できるか?(2011.10.30)
- TwitterをP2Pで実現する方法をもう少し考えてみる(2010.05.03)
- オフィスツアー(ビットメディア)を振り返る(2009.10.25)
- [開催日変更]オフィスツアー(株式会社ビットメディア)参加者募集のご案内(2009.08.14)
- [NAT]NAT越え入門1-NATとは何か?(2009.04.11)

Comments