それでは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 を発行だけすれば良いことになりますね。
SNSの認証における一番のポイントは、SNSの要である、ユーザAがユーザCの 「友人の友人」である場合、どのようにそれを証明するかです。もう少し詳しく 書けばAとBが友人同士でBとCが友人同士の場合、AがCを見た場合、Bを通して友人の友人であることを理解できるかということです。
<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での認証は今後の重要技術となるでしょう。