怎样设计一个100%可靠的P2P通信系统用于抗击核打击

我没有题主那样脑洞大开。我想要的,只是一个:可扩展的、更安全的、更可靠的P2P系统。抛开链路层面的东西,光就逻辑层面怎么去设计和实现这样一个系统。之前有过一定研究,就把研究的结果在这里总结一下。根据CAP theorem,一个分布式系统,不可能同时具备:Consistency:所有节点看到了同样的信息Availability:任何一个节点的操作都能保证得到成功或者失败的响应Partition Tolerance:由于网络问题导致的系统分裂下,各个部分依然可以正常工作目前大规模使用的DHT(Kademlia),是基于如下假设才能保证AP:所有节点都是正常的(没有恶意节点)系统的任意两个节点可以互通而bitcoin只能保证CA,同样基于上面的两个假设。而事实上,两个节点间不能互通的情况,在目前IPV4地址稀缺,NAT大规模使用,国际出口极其狭窄(中国网民人均7.9bps)的,还有GFW的情况下,实在是太常见了,更别提有不少别有用心的厂商(比如已经基本死掉的VeryCD和目前蹦跶的很欢的XL)扮演的恶意用户的角色。实际使用的P2P网络,其实很脆弱。安全方面的问题,我研究过下面这些:1、身份识别1.1 线上-线下身份识别:如何证明线上身份对应的线下身份是真实的?目前没有特别有效的方式,哪怕纯线下也没有特别有效的方式,身份证、指纹等都可以伪造。1.2 线上身份识别:如何证明线上身份代表的实体还是原来的实体?- 最常见的方式是采用用户名+密码。这种防护手段也是最弱的,知道用户名就能猜密码。- 比较有效的方式是pubic key+密码,用户必须同时拥有private key和密码才能确认身份,而单独拥有public key,没有private key,没法猜密码。2、信用基于身份识别后就是线上身份的信用。怎么确定线上的身份是个好人还是坏人,是网络的正常参与者还是破坏者。比如破坏者可以只享受权利而不付出义务(比如P2P文件传输的的时候只下载而不上传,BT资源只传给某雷用户而不传给其他BT用户)。而在网络中作为破坏者的行为,则称为Byzantine failure,有别于P2P系统中正常的由于客观原因导致的没有相应,这类failure是主动的,有选择性的,有针对性的。一旦破坏者进行了串通,其数量和正常用户的比率大于一定值,或者在网络局部大于一定值的时候,破坏者就可在整体或者局部上“上位”成“正常者”。这种攻击方式称为Sibyl Attack(没错,就是Psycho-pass里那个sibyl system为啥要把异类消灭的原因了)。为了防止Sibyl attack,系统需要有识别Byzantine failure的能力。由于A和B是peer,彼此是平等的,互相知道并不知道对方是否在欺骗。所以需要第三方C的帮助,而这个第三方C如果是个体,那通常也不可靠,最好是一个群体。在防止Byzantine failure中,最经典的方式是系统中的其他人都是C,A和B的信息交换需要整个系统所有成员的确认。而这种集体确认的方式是很难scale的。根据C的不同,这类防止Byzantine failiure的方式主要分为3类。2.1 bitcoin的Blockchain:系统全局只有一个正确的数据版本,各个数据块组成链式结构,添加一个新的数据块的时候,必须获取到已经有的被认可的数据块的信息,组合成一个新的版本,而各个P2P节点均需要确认这个版本的正确性。由于只有一个全局数据链,这个系统也有scale的问题,但是Bitcoin通常认为只有有6个以上节点确认,不需要系统所有成员的确认,就认为这个全局数据是正确的,这就使得这种算法有了一定的scale的能力。但blockchain有个致命的问题,如果某个节点确认了数据A,但不发布,其他节点无法确认这个数据,就以A的前一个版本为基础,认为A\u0026#39;是目前的最新版,由此出了B\u0026#39;,C\u0026#39;等版本。但一段时间后,那个恶意节点发布了A的信息,系统则认为A\u0026#39;是错误的,因此,B\u0026#39;,C\u0026#39;等一系列后续版本均会被认为是错误的。2.2 基于CA的身份识别:用CA签发的证书,证明自己不是恶意节点。其他节点因为信任CA,所以信任CA担保的用户。这个是传统互联网的“证书链”的方式。而针对恶意节点的控制,主要也取决于CA可以及时地吊销恶意节点的证书。这种方式有个致命弱点,就是CA本身是没有担保的,用户必须无条件地信任CA,一旦CA作恶或者CA被作恶的攻陷,整个系统就完蛋了,即所谓的single point failure。2.3 基于quorum的确认方式。要证明对方不是坏人,只要找一堆人(quorum),让他们说对方是不是坏人,根据那一堆人的投票,觉得对方是否可以被信任。这里,quorum越大,能够同时容忍的坏人也就越多,quorum无限大,则等于最经典的防止Byzantine failure的方式了。但是一旦恶意用户可以控制quorum的选择,则这里方式就无效了。所以需要有各种方式去保证quorum不能被攻击者选择。- 动态quorum BT网络中,节点ID的选择是随机的,用户可以选择最近的几个节点作为quorum,这样quorum的选择也是随机的。但恶意用户可以用offline-online attack的方式,去指定自己的节点ID号,使得自己和同伙的节点ID号变成最接近要攻击用户的ID,这样就能控制被攻击用户的通信,从而控制其quorum的选择。BT网络的某安全改进(http://libtorrent.org/dht_sec.html),就是限制ID的随机选择位数,限制攻击者自由选择ID号的能力,大大增加了offline-online attack的代价。但是这样做,会使得ID的分布不再均匀,整个网络的路由能力下降。而某Kadmelia的安全改进(S/Kademlia: A practicable approach towards secure key-based routing)中,把public key generation,ID generation 和proof-of-work的方式联系起来,使得选择性地指定ID的代价变得很大,从而使得对抗offline-online attack,间接保证了按原有方式选择quorum依然有足够的安全性。- quorum是可以相对固定的,通过distributed key generation的方式,去构建一个属于团体的threshold cryptosystem。类比于线下世界的多把钥匙同时在场才能开一把锁,threshold cryptosystem(Threshold Signatures, Multisignatures and Blind Signatures Based on the Gap-Diffie-Hellman-Group Signature Scheme.)中,只需要团体中有钥匙的人数大于一个固定的值,就能开锁,而不要求全体成员均在场。正常用户可以得到quorum用户的检验,quorum用分布式的共享threshold private key签发了一个证书,这个证书,只有在大于某一阈值的quorum成员共同在场,用他们共享的private key去解开才能认证。这样做,就不需要CA,没有single point failure的问题。但这类quorum的缺点也比较明显:quorum是相对固定的(虽然允许一定数量的成员不在场),而且是事先确定好的,不太适合成员变动比较频繁的系统。
■网友


推荐阅读