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」カテゴリの記事
- WebRTCを実現するためにSTUNだけでなくTURNも必要な理由(2015.01.08)
- [P2P]P2Pストリーミングのサーベイ文書について(2014.11.09)
- Winnyの開発者、金子 勇氏の急逝を悼んで(2013.07.07)
- 「分散ハッシュシステムでのNAT超えの考察」に対する質問について(2012.12.16)
- [P2P]Websocketでブラウザ間P2P通信は実現できるか?(その2)(2011.11.20)
この記事へのコメントは終了しました。
コメント