P2Pと認証、P2PでのSNS


課金をしたりその人の正当性を保障するに当たり、認証技術は欠かせません。P2Pによる認証については非常に難しい問題ですが、それを解決する方法についてここでは提案したいと思います。また最後にMixiに代表されるSNS(ソーシャルネットワーキングサイト)をP2Pで実現する方法を書いてまとめとします。
ご存知の通り、P2PはHybrid-P2PとPure-P2Pに分かれます。Hybrid-P2Pについては認証は非常に楽です。というのは、中央サーバが存在しなければ、サービスが開始できないため、必ず中央サーバにアクセスしなければならないからです。ここで認証を行えば、相手の正当性を確認できる訳です。

それではPure-P2Pではどうでしょうか?選択肢としては、

(1)認証サーバを設けサービス利用時に必ずそこに一度アクセスする
(2)PKIを用いる
(3)自己証明書を使用する

の3つの方法が有効と考えられます。(2),(3)と共に電子証明書を利用します。

(2)と(3)の違いは何でしょうか?(2)は簡単にいうと、ある信頼できる人・機関が あるユーザの身分を証明する事を意味します。日常生活で言うと、運転免許書を 警察署が配布するようなものです。逆に(3)は自分で自分のことを証明することで PGPに近い方法です。これはある人が「おれはxxxxです。信用してね!」と 「自分自身」で言っていることと同様です。(もちろんPGPのように友人がある人の信頼性を保障するように拡張する事も可能です。)

(2)は高コストですが、身分をほぼ確実に保証する事ができます。(3)では 証明書で提示された内容が本当にそうだか誰も証明する事が出来ない場合もあります。 しかしながら非常に低コストに運用する事が可能なので、それなりの身分保障が 求められ 個人や中小企業など運用コストを低廉化したい場合には良いでしょう。

これから先は(2)のPKIを利用して各ノードにネットワーク負荷等を分散させて 認証を行う手段を説明します。[なおここで説明する(2)の方法は(3)の自己証明書を 使用する方法もほぼ同様に応用できます。]

ここではDHT(分散ハッシュ)の利用を想定しています。PKIについてあまりご存知ない方はまず、下記のURLをご覧になってから次に進んで下さい。
@IT:五分で絶対に分かるPKI
さて、今AとBがいて、BがAを本当に存在する人かどうか認証を行う事にします。まず、AとBはCAで電子証明書を発行してもらいます。ユーザ名をnameとするとこの電子証明書はNode_ID=(hash(name))というノードに格納します。もちろん、各電子署名書はCAの秘密鍵によって署名されていて、各ユーザが持っている電子証明書によって、CAによって署名されているかどうかは検証できます。

では実際にBがAを認証する事を考えましょう。
(1)AはBに電子証明書を渡す。
(2)Bはもらった電子証明書がCAによって署名されているか検証する。
(3)Bはもらった電子証明書が現時点で有効であるか検証する。

(1),(2)は普通のPKIの流れです。若干(3)についてはP2Pだとやり取りが変わります。例えば、電子署名書が現時点で有効かどうか確認するためにはCRLやOCSPを使うわけですが、これもDHTを使うと簡素ができます。つまり、ユーザnameのCRLについては、Node_ID=hash(name)に格納してしまうのです。そこで、(3)の作業ではBはNode_ID=hash(A)というノードにアクセスして、Aの証明書が有効がどうかをチェックするわけです。これでPKIによるP2Pの認証作業は終了致します。こうすればCA側はユーザの電子証明書・CRL を発行だけすれば良いことになりますね。


P2Pによるソーシャルネットワーキングサイト(SNS)の構築
ではP2Pの認証技術の応用例として、ソーシャルネットワーキングサイト(SNS)を 構築しましょう。SNSとはblogや掲示板などによる複合コミュニティサイトで、 MixiやGreeが代表例です。blogについては友人、あるいは友人の友人までの公開等 の制限が可能です。また掲示板についても管理者の承認者がないと記入できない等 のオプションもあります。

SNSの認証における一番のポイントは、SNSの要である、ユーザAがユーザCの 「友人の友人」である場合、どのようにそれを証明するかです。もう少し詳しく 書けばAとBが友人同士でBとCが友人同士の場合、AがCを見た場合、Bを通して友人の友人であることを理解できるかということです。


まず、AがBを友人であると記述するにはどうすれば良いのでしょうか?これにはFOAFという技術を使うと良さそうです。FOAFを使うと、Bがどのような人であるか記述する事が出来るからです。FOAFについては下記のURLをご覧下さい。
メタデータによる知人ネットワークの表現
これによって、BはAの友人であること、CはBの友人であることを記述できます。各FOAFの情報は各ユーザによって電子署名がされていて,Node_ID=hash(name)に格納されています。例えばTomoがP2P Todayさんと友達であることはFOAFを書くと次のように書けます。 (一部省略)

<rdf:RDF ・・・.>
   <foam:PersonalProfileDocument rdf:about="">……
    </foaf:PersonalProfileDocument>
    <foaf:Person rdf:nodeID="me"> 
         <foaf:name>Toremoro Tomo</foaf:name>
          <foaf:givenname>Toremoro</foaf:givenname>
          <foaf:family_name>Tomo</foaf:family_name>
           <foaf:nick>Tomo>/foaf:nick>
           <foaf:mbox rdf:resource="mailto:aaa@bbb"/>
                  <foaf:knows>
                       <foaf:Person>
                                 <foaf:name>P2P Today</foaf:name>
                                 <foaf:mbox rdf:resource="mailto:ccc@ddd"/>
                        </foaf:Person>
                   </foaf:knows>
    </foaf:Person>
</rdf:RDF>

ではCがAを友人の友人であることを証明するにはどうすれば良いのでしょうか?次のようにすれば証明できそうです。
(1)まずAはC対してBを知っている事を通知する。
(2)次にCはAの本人認証をする。Node_ID=hash(naem_A)からAの電子証明書を入手。それを元にチャレンジレスポンス法等によってAを認証。
(3)Cは自分のFOAFから友人にBが居る事を確認する。
(4)友人Bの電子証明書(あればCRLも)をNode_ID=hash(name_B)から取得。有効性を確認。
(5)Node_ID=hash(name_B)となるノードにアクセスし、BのFOAFを確認し有効性を確認。その後Bの友人がAであることを確認する。

このようにすれば、AはBを通してCの友人の友人であることを知る事が出来ます。理論的にはN次の繋がりでの認証も出来ます。(友人の友人は2次の認証)P2Pでの認証は今後の重要技術となるでしょう。


最後にP2Pとコンテンツ課金について説明します。

NEXT

TOPページに戻る