(原创作品,转载请告知,并注明出处。)
本章对ZeroNet平台作了详细的介绍。本章首先介绍ZeroNet平台产生的目的与发展历程,随后对ZeroNet平台的设计思想与其中使用的各类技术的原理进行了解释说明,接下来本章展示了ZeroNet的部分功能的详细设计与使用,并在最后展示了部分ZeroNet网站和ZeroNet中的技术在这些网站中的实际应用。
1 设计目标
ZeroNet的设计者认为网络应该是一个开放、自由和无审查的交流平台,而现今的大多数网络都此含义相悖。
我们知道,欲建立一个可供他人访问并为他人服务的网站需要网站建立者购买或租用服务器,网站建立者需要根据自己的业务类型进行调研分析,确定网站类型,并在该服务器上进行网站环境的搭建,把已写好的网站部署在服务器上。同时,为了用户访问方便,网站建立者通常还需要购买域名,并将域名解析到自己的服务器上。在我国,网站建立者还需要对域名进行备案。这一系列过程增加了建立网站的门槛,ZeroNet设计者认为这不符合网络精神。
对于一般的网站,网站的运营受到很多因素的制约,如网站内容受审查、服务器到期、网络条件差等,而一旦网站遇到上述任何问题,都可能导致网站的关停或掉线。同时,对服务器的管理和维护也需要网站建立者投入资金、花费大量时间和精力,对于一些欲分享自己的成果却缺少这些资源的人来说,运行属于自己的网站也是不可能的事情。这些也不符合网络的精神。
因此,ZeroNet的设计者便构想出了这样一个平台,能使所有的网站无法关停、不会掉线、无服务器、无托管费用、快速并可离线运行等。这与传统网站思想截然不同,因此在设计之初便吸引了一大批网络爱好者的兴趣。
ZeroNet项目启动于2014年12月底,并于2015年1月中旬发布了第一版。在后续的更新中,ZeroNet逐步完善和添加新的功能,如支持多用户交互、Peer交换、加密连接、Tor支持等。随着ZeroNet功能的不断完善,ZeroNet的用户和志愿者也越来越多。如今,ZeroNet的用户已遍布全球(如图1),任何时刻有节点在线,已经实现了无法关闭、不受单点故障影响的目标。
ZeroNet上的网站仅使用HTML、JavaScript和CSS语言或技术,同时支持一键克隆其它网站,大大降低了建立网站的门槛。网站建立完成后,只需一条命令或一个按钮即可发布网站,十分便捷。在保证信息真实性和不可否认性方面,ZeroNet采用了BitCoin加密技术,以公钥作为用户身份标识,每个用户都有独一无二的比特币种子、私钥和公钥,每个用户在不同网站都有对应的公私钥对,这保证了用户身份的唯一性,而其依据的密码算法也保证了用户及其账户的信息安全。
2 基础知识
ZeroNet网站访问时需要把站点的全部内容下载到本地中来,浏览器通过ZeroNet读取本地数据。在访问时,需要先获取到保存有该站点数据的节点信息,随后选取可用节点,与之联系,下载获取数据。这个过程使用的有BitTorrent技术和P2P技术,其中BitTorrent部分用来获取其它节点的信息,P2P部分用来与其它节点交互。上节提到,ZeroNet中的身份认证与信息的安全性保证使用的是BitCoin加密技术,这是一个基于椭圆曲线的公钥密码算法,目前广泛用于网络活动中。ZeroNet中的匿名性由BitTorrent网络和Tor网络进行保证。本节中将对这些技术进行介绍。
2.1 P2P
随着网络的普及与发展,传统的C/S结构中的网络应用服务器的性能问题和单点失效问题限制了系统的资源利用,也无法满足分布式应用的需求。P2P(Peer-to-Peer)技术的出现缓和了这一问题。惠普实验室将P2P定义为利用分布式资源以非集中的方式完成特定功能的一类系统或应用[3]。它首先可以利用分布式资源,这种分布式资源可以是网络带宽、存储资源、计算能力以及数据等。它完成的“特定功能”包括数据或内容共享、交流与协作或其它服务等。通常情况下,中心服务器可能因条件限制,即使处于忙碌状态也无法满足客户对各种资源的需求,而此时客户所拥有的资源却会出现大量闲置。P2P则充分利用客户的闲置资源,既能满足资源的最大化利用,也能使客户获取到所需资源,一举多得(如图2)。
P2P网络具有非中心化、自适应性、健壮性、高性价比和负载均衡等特性[4],其节点具有对等性,即P2P网络节点共同承担相同的职责,并采用对等的网络通信模式。目前应用最广泛的P2P的网络结构是部分分布式拓扑,它是在中心化拓扑和全分布式拓扑结构的基础上发展来的,它充分利用了节点的异构特性[5]。中心化拓扑结构中,当用户需要获取某资源时,用户需要与索引服务器建立连接,由索引服务器告知用户拥有资源的节点的信息,用户再与节点连接,获取数据。这种结构并不是完全的P2P结构,因为有索引服务器的存在,还是会受服务器的资源限制和单点失效的影响。全分布式拓扑结构中没有设置索引服务器,取而代之的是,每次当用户需要获取某资源时,用户需要在一定范围内进行请求“洪泛”,其它节点收到请求后对其进行响应,随后建立连接。这种结构不适合大规模的网络环境,同时随着网络节点的增加,它对网络资源的占用量也越来越多。部分分布式拓扑选取性能较好的节点作为超级节点,每个超级节点管辖一批普通节点,查询请求不经过一般节点,只在超级节点中转发。这样可以有效减少洪泛带来的网络流量。此外,这种系统还可以对文件进行分片,从而使同一个节点能同时下载和上传同一文件的不同分片,提高了传输速度。BitTorrent使用的就是这种结构。
P2P网络的这类个人用户提供资源共享、个体节点对等通信和便捷灵活的网络自组织特性与生活中人与人的交流十分类似,而且其具有传输文件内容速度快、可获取资源数目多等优点,受到了广大Internet用户的欢迎,并得到了迅猛的发展。
2.2 BitTorrent
BitTorrent是P2P文件共享通信协议,用来进行互联网上的数据和电子文档的分发。BitTorrent是传输包括视频、音频在内的一些大文件中使用的最广泛的协议之一。BitTorrent支持多用户同时下载,用户在下载某文件的同时也在上传该文件的已下载部分给其他用户。所以当同时在线下载的用户越多的时候,下载的速度越快。
用户使用BitTorrent时需要寻找其他用户的信息,这里需要一个中心服务器,称为Tracker。当文件分享者欲分享一个文件时,分享者会在Tracker处拿到属于自己的peer-id,用于标识自己的身份和供他人寻找自己的地址。分享者会使用一些BT软件生成.torrent类型的种子文件,下载者通过种子文件获取Tracker信息,进而获得分享者的信息。当有很多用户正在下载或下载完毕时,如果向Tracker发出请求,Tracker会返回多个共享者信息,新下载者可以与这些共享者建立连接,共同下载该文件。
一个.torrent文件中包含Tracker地址、文件名称、文件大小、创建.torrent的客户端版本、发布者、文件分片及各分片的哈希值等信息。图3是一个.torrent文件示例。图中第1部分是一些Tracker服务器的地址,第2部分是分享的文件信息,第3部分是文件的分片信息。.torrent文件格式使用了Bencoding编码方法,支持字符串、整数、列表、字典四种数据格式。一个.torrent文件就是一个经过编码的Bencoding字典。
在Bencoding格式中,对于字符串,首先给出字符串的长度,原字符串跟在一个冒号后面,紧随其后,如“5:color”代表字符串“color”。对于整数,以字母“i”开始(代表integer),然后紧跟十进制的整数值,最后以字母“e”结尾(表示end),如“i5e”表示5,除了“i0e”表示数字“0”外,所有以0起始的整数都无效。对于列表,以字母“l”开始(代表list),然后跟着列表值的编码(也采用Bencoding编码),最后以字母“e”结束,例如“l3:red4:blue”表示 [‘red’, ‘blue’]。对于字典的编码,以“d”开始(代表dictionary),然后是可选的keys和它的值,最后以字母“e”结束,例如:d3:sun3:red4:moon4:bluee,表示{‘sun’:‘red’, ‘moon’:‘blue’}。由此可以看出,.torrent文件中的信息是一个包含了文件所有者及文件信息的字典。
图4为用户向Tracker发出的请求,其中包含了用户的ID、需要的Peers数量、当前已下载的数量、请求文件信息、用户端口等信息。从图中可以看出,此次用户向Tracker请求30个其他节点的信息,自身开放端口为0(在ZeroNet的Tracker请求中,除了15441端口外,其余端口均用0来代替)。Tracker收到请求后向用户回复一个包括所有已完成下载的总数、正在下载的数量和其他节点地址信息(IP:端口)的数据包,也使用Bencoding编码,如图2-5所示。图中的peers后面即为其他节点信息,供30条,180字节。图中标记为1的是某节点的IP,标记为2的是该节点的端口。我们可以看到,端口只有两种情况,即0000(代表数字0)和3C51(代表数字15441)。在ZeroNet中,用户收到这样的报文后会记录所有的IP,并从端口不为0的节点中选取5个进行连接。整个过程中,节点的存活判断由ZeroNet进行验证。
2.3 BitCoin密码算法
在ZeroNet中,公钥密码算法一直在使用。在初始化ZeroNet时已经使用到了公钥密码。ZeroNet中的网站地址就是该网站的公钥,用户可以很方便地用其验证网站签名的真实性,这也省去了建立PKI的过程,大大减少了ZeroNet运行的障碍。ZeroNet中使用的公钥密码算法是BitCoin(比特币)密码算法。BitCoin密码算法主要是基于椭圆曲线公钥密码算法,其中还用到了哈希算法、Base58算法等。本小节将对椭圆曲线密码算法和BitCoin密码算法进行介绍。
2.3.1 椭圆曲线密码算法
相比于传统对称密码,公钥密码十分年轻,公钥密码思想于1976年首次提出。公钥密码算法现在主要用于对称密码算法中的密钥建立与加密、消息认证、数字签名等。公钥密码算法一般基于破解难度大的数学难题之上,因其所依据的数学原理只有三类,故现在实践使用中的公钥密码算法只有三类,如表1。
原理 | 代表 |
大整数分解机制 | RSA |
离散对数机制 | DHKE、Elgamal、DSA |
椭圆曲线机制 | ECDH、ECDSA |
椭圆曲线密码算法(Elliptic Curve Cryptography,ECC)于上世纪80年代中期首次提出。相比于RSA,椭圆曲线密码算法以高效性著称。RSA中需要1024至3072比特长度密钥提供的安全性,椭圆曲线密码算法只需要160至256比特,密钥长度大大减少,是已知公钥密码算法中每位密钥提供加密强度最大的一种体制(如表2)。椭圆曲线密码算法基于椭圆曲线上的离散对数难解性。已知椭圆曲线E 和E上的一个点P,随机生成一个整数d,容易计算点T=dP,但给定点T 和P,计算d 却极其困难。通信双方把d1、d2作为私钥,把信息编码为椭圆曲线上的点进行传输。
对称密码密钥长度 | RSA 和D-H 密钥长度 | ECC密钥长度 |
80 | 1024 | 160 |
112 | 2048 | 224 |
128 | 3072 | 256 |
192 | 7680 | 384 |
256 | 15360 | 521 |
NIST 推荐密钥长度 (单位:比特bits) |
有限域上的椭圆曲线是指对于整数a、b,满足形如方程
y2 ≡ x3+ax+b (mod p),其中4a3+27b2 ≠ 0 (mod p) (1)
的所有点的集合,外加一个无穷远点,其中a、b、 x和y在GF(p)域上取值。这种椭圆曲线也简记为Ep(a, b)。
椭圆曲线密码算法的加密过程如下。A选定一条椭圆曲线Ep(a, b)和Ep上的一点G,选取私钥k,计算K=kG,将Ep、K和G发送给B。B收到A发来的信息后,将信息编码到Ep上的点M上,并选取私钥r,计算C1=M+rK,C2=rG,并将C1、C2发送给A。A收到C1和C2后计算C1–kC2=M+rkG–krG=M。即使传输的这些点被攻击者窃取,在得不到k和r的情况下,也是无法获得含有信息编码的点M的。
椭圆曲线密码算法的签名过程如下。A选定一条椭圆曲线Ep(a, b)和Ep上的一点G,选取私钥k,计算K=kG,选取私钥r,计算R=rG。对于信息M,计算M的哈希值H=hash(M),计算M′≡M mod p,计算S≡(H+ kM′)/r mod p。计算完这些参数后,A公布S、M′、Ep(a, b)、K、R和G,验证者根据这些参数对信息M进行验证。验证者首先计算M的哈希值H′=hash(M),计算M′≡M mod p,计算R′=(H′G+KM′)/S,若M正确且由A发出,则R′=r(H′G+kGM′)/(H+kM′)=rG=R,若信息遭篡改或不是由A发出,则R′≠R。攻击者在得不到k的情况下无法对消息进行篡改或对签名进行伪造。
使用椭圆曲线密码算法是因为其具有很好的单项特性,不易破解。如果选取适当的椭圆曲线,在选用160位密钥的情况下,破解也需要280步。而现实使用中的椭圆曲线密钥为256位,破解需要2128步,在现有计算条件下是不可能在信息解密前完成破解任务的。一般而言,我们推荐选取NIST推荐的椭圆曲线。椭圆曲线密码算法在很多方面的表现都比其它公钥算法优秀,但在短密钥的签名验证方面,ECC没有RSA快。相比其它公钥算法,椭圆曲线密码算法在很多领域应用发展比较缓慢,但椭圆曲线密码算法广泛应用于新兴应用中,如嵌入式平台等。[6]
2.3.2 消息摘要与数字签名
哈希算法可以将任意长度的消息(包括字符串、文件)映射为较短固定长度的二进制值,称为消息摘要。当消息修改了任意一位,得到的哈希值将完全不同。哈希算法是不可逆的,即知道消息M,我们可以得到它的哈希值h(M),但知道哈希值h(M),我们却得不到消息M。因此,哈希算法通常用在消息的完整性验证上。现在使用较多的哈希算法有MD5、SHA-1、SHA-256等,它们输出的哈希值的长度分别为128位、160位和256位。
由于哈希函数可以对任意长度的任意文本、字符进行摘要,而摘要值的长度是固定的,故哈希函数存在碰撞的问题。2004年中国学者王小云发现并实现了MD5的碰撞,轰动了密码学界,MD5从此被认为是不安全的。在实际使用中,由于MD5产生的哈希值位数较短,很多网站仍在使用。目前建议不使用MD5算法,而是使用SHA-1或安全级别更高的哈希算法。在BitCoin密码中使用的是SHA-256算法。
GB/T 25069-2010中对签名和数字签名的定义分别如下。签名(Signature)是签名生成过程中产生的一个或多个元素。用实体的私钥对相关数据进行密钥变换。数字签名(Digital Signature)是附加在数据单元上的数据,或是对数据单元所作的密码变换,这种数据或变换允许数据单元的接收者用以确认数据单元的来源和完整性,并保护数据防止被人(例如接收者)伪造或抵赖。[7]
数字签名提供了消息的完整性、真实性和不可否认性的认证。消息发送者使用自己的私钥对消息进行签名,当对方需要收到消息后,可以通过发送者的公钥对签名进行验证,如果消息遭到篡改,则验证会不通过。当消息发送者否认自己发送过某条消息时,如果用发送者的公钥验证消息的签名通过了,则表示该消息确实由该发送者发出。常用的数字签名算法有RSA签名、Elgamal数字签名、DSA和ECDSA。在BitCoin中使用的是ECDSA,它与ECC一样,具有密钥长度短,单位密钥加密强度大的特点,通常选取的密钥长度为160位至256位。
2.3.3 BitCoin密码算法
BitCoin密码算法用来保护用户的比特币账户安全和进行比特币交易。每个比特币账户都有一个成对的私钥、公钥和比特币地址,由私钥可以生成公钥,由公钥可以生成地址,而这两个过程都是不可逆的,如图6所示。
私钥是一个随机生成的数字,长度为256位。私钥用于生成比特币所必需的签名,可以证明比特币的所有权。私钥的所有与控制权代表着一个比特币地址中资金的所有与控制权。一旦私钥遭到泄露或丢失,则被私钥保护的资金也将陷入危险,甚至永远丢失。图7便是一个随机生成的私钥(十六进制表示)。私钥有三种表示方法,分别为Hex、WIF和WIF-compressed,表3是同一私钥的不同表示。
格式 | 私钥 |
Hex | 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD |
WIF | 5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn |
WIF-compressed | KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ |
根据椭圆曲线密码算法可以得到公钥,这是个不可逆的过程。K=kG,其中k为私钥,G是称为生成点的常数点,所有比特币的生成点都是相同的,K为公钥。公钥也有多种格式表示,主要是分为压缩的和非压缩的两种,如图8所示。
在比特币密码中,比特币地址是供其他人与自己交往的账户。比特币地址通常由数字“1”开头,由公钥经过哈希变换生成。这里用到的哈希算法为SHA-256和RIPEMD-160。具体计算为,先求公钥K的SHA-256值,再对求此数值的RIPEMD-160的值,即A = RIPEMD160(SHA256(K)),A的长度为160位,即为比特币地址。通常作为账户的比特币地址还要进行Base58编码、添加校验位和版本号等,如图2-9,最终得到形如图2-10形式的地址。[8]
在ZeroNet中,比特币地址作为网站的地址和公钥,网站的私钥由用户自己保存。其他用户访问时使用网站公钥(网址,比特币地址)进行网址内容签名的验证。用户更新网站后,需要使用私钥对网站进行签名和发布。
2.4 Tor
Tor匿名网络是目前使用最为广泛的匿名网络之一,它最初由美国海军计算机系统安全研究实验室提出,旨在在互联网上对网络使用者的网络与通信信息进行隐藏,避免攻击者进行流量窃听。作为第二代Onion路由匿名通信系统的代表,Tor目前主要通过终端用户使用支持onion代理的客户端进行访问。Tor在全球有数千个志愿节点,拥有数百万用户。
Tor访问的过程中通常需要多个中继节点的支持,而且在访问过程中中继节点会进行更换,因此溯源难度较大。Tor用户通过本机的Tor代理服务与其他的Tor进行交流,进而在Tor中形成一个虚拟网络。Tor对应用层数据进行加密,在传输的每个路由间都进行加密,好比洋葱的一层一层皮,而终端在得到数据后需要对其层层解密。
在访问时,用户的Tor代理会首先获得访问目录,获取Tor中的节点信息,然后从获取到的节点中随机选择一些作为本次访问的中继节点,包括入口节点、中间节点和出口节点。这里只有入口节点知道访问来源,即用户的信息,而中间节点则只知道入口节点和出口节点,却不知道访问来源和去处。出口节点知道访问的去处,即通信的接收者信息,负责连接Tor网络和普通互联网,同时还要对来自Tor网络中的数据进行解密和对来自外部互联网的数据进行加密。访问时,用户Tor代理会和每个中继节点协商会话密钥。[9]
在ZeroNet中,匿名性主要由Tor和BitTorrent提供。
2.5 其它
ZeroNet使用的语言是Python。在运行ZeroNet时,ZeroNet会打开一些本机端口,分别作为和浏览器、外部节点、内部文件传输等使用,即ZeroNet既是一个客户端,也是一个服务器。
作为客户端,ZeroNet使用Python自带的socket库进行连接。ZeroNet定义了一些自己独有的命令格式,在收到其他节点或本机发来的数据后,ZeroNet后台程序会解析这些数据,进而通过Python语言执行命令。通常这些命令包括文件创建与删除、文件传输、请求响应等。
作为服务器,ZeroNet使用Python的WSGI(Web Server Gateway Interface,Web服务器网关接口)进行动态Web页面的生成。WSGI是一个服务器与访问者的接口,用于处理不同的Web框架、服务器和其他调用方式,其目标是在Web服务器和框架层之间提供一个通用API标准,减少之间的互操作性并形成同一的调用方式。[10]这里主要用于对请求或命令进行Web响应。
3 ZeroNet常用操作
本节将根据上节的原理,针对ZeroNet的使用进行详细介绍。ZeroNet支持Windows、Linux和MaxOS等操作系统。在ZeroNet官方网站上下载对应的版本,安装好需要的环境(Python 2.7和Python下的gevent、msgpack-python包)后,双击zeronet.exe或zeronet.py即可运行ZeroNet程序。第一次打开时,ZeroNet会在data目录下创建users.json等文件,其中users,json用来进行用户标识,即使在一个新环境下,只要有原先的users.json文件,仍能获得原先的身份。ZeroNet还会访问一个名为ZeroNet的网站。这个网站中包括了所有的ZeroNet中.bit后缀的网站和其对应的公钥网站地址,ZeroNet将此网站作为“DNS”来使用。初始操作完成后就可以访问ZeroNet网站了。
3.1 ZeroNet网站
上节已经提到,ZeroNet网站的地址是ZeroNet中的公钥,对应的是BitCoin密码中的比特币地址。一般而言,一个ZeroNet网站地址如图11所示。地址的第一部分是固定的,为http://127.0.0.1:43110/,第二部分是ZeroNet站点的地址,如1HeLLo4uzjaLetFx6NH3PMwFP3qbRbTf3D等。这个地址在创建网站时自动生成,与这个地址一同生成的还有用于对这个网站进行签名和发布的私钥,如图12。
ZeroNet提供了三种网站创建的方式,分别为命令创建、界面创建和网站克隆。使用命令创建网站时需要在ZeroNet目录下在控制台中输入
zeronet.py siteCreate
命令,如图12。此时将生成网站的公私钥对,同时ZeroNet会在自身的data目录下生成一个名为网站地址的文件夹,文件夹内有一个包含content.json文件的data文件夹和content.json、index.html两个文件。修改网站即为对该HTML文件进行编辑,在此目录下创建各资源文件、JavaScript文件和CSS文件等。在修改网站后,如果要发布网站,需要先用私钥对网站进行签名。签名会对网站目录下的所有供其他用户访问的文件求哈希值,把网站的其他设置(如网站地址、标题、语言、修改时间、版本等)连同各文件的哈希值、大小等信息一并写入网站根目录下的content.json文件中,随后对这些数值进行签名,把签名值也写入content.json中。网站的发布也需要使用私钥。
使用界面创建网站时,在ZeroNet网站的初始站点ZeroHello页面中点击如图13中的#1处,显示出选项列表,随后在选项列表的#2出点击“新建空站点”按钮,即可创建一个新的ZeroNet站点,如图14所示。编辑网站过程和上述一样。在编辑完成后,在ZeroNet中访问此自己的网站,在自己网站的如图2-13中的#3处有一个一样的圆形按钮,点击并左拉会出现有关于网站的用户、缓存等的界面,在这里的最下方有如图15的设置项。在这里可以填写网站的一些信息,并可以点击“签名”和“发布”按钮对网站进行签名和发布。
另一种创建网站的方法是克隆。克隆法免去了自己修改编写HTML等文件的过程,可以直接将其他人写好的网站进行克隆,获取对方网站的初始框架和界面,对方网站中的数据无法获取。自己所有访问过的网站都在ZeroHello页面的左侧显示列出,点击如图16的#1处显示选项列表,当网站所有者允许对该网站进行克隆时,选项中会有“克隆”选项,点击即可。克隆网站的签名和发布与界面创建的网站相同。
3.2 ZeroNet访问与更新
在ZeroNet中,访问网站需要把目标网站的所有东西下载下来,保存到data目录下以网站地址命名的文件夹下,然后在本地读取数据。访问时,首先根据访问的网站地址构造Tracker请求(如图4),从Tracker出获取其它节点的信息(IP、端口,如图5)。ZeroNet会判断能否使用本机公网IP的15441端口,如果不行,则构造请求时,本机的端口填0。在收到Tracker发来的节点信息后,ZeroNet把所有的IP地址保存起来,在端口不为0的节点中选取5个进行连接。当再次访问时,ZeroNet还会向Tracker请求节点信息,在收到Tracker的回复后,把这批中的新节点继续保存起来,从这批节点中选5个端口不为0的进行连接。
在与节点建立连接后,ZeroNet会请求对方所保存的目标网站的content.json文件,读取content.json文件中信息,比较更新程度,验证签名是否通过。待验证通过后,ZeroNet会请求下载content.json中列出的文件。文件下载到本地后还会进行哈希值的校验,以确保收到的网站文件未经篡改。待完成这一过程后,浏览器读取本地的index.html文件,展示目标站点的内容。由于ZeroNet同时与好几个节点进行连接,所以这个过程不会有太大延迟。
当ZeroNet中的网站所有者对网站进行更新时,网站所有者会选取5个节点进行告知。网站所有者会给这5个节点发送新的content.json文件,这5个节点收到文件后会比对自己已保存的content.json文件,若新收到文件更新,则验证文件的签名。当签名也验证通过,节点便会请求下载新的网站内容,并再通知5个节点,依此类推。所以ZeroNet网站的更新会有一定的延迟,但由于更新节点数目是曾指数型增长的,更新延迟不会太大。
当一个用户已缓存了许多ZeroNet网站,则当该用户离线时,仍能从本地读取缓存的网站,仍能对这些网站进行访问,但该用户将收不到网站的更新,直到该用户下次联网。
ZeroNet中的data目录下还有一个users.json文件,用来标识用户身份。ZeroNet为用户访问过的每个网站都创建了唯一的“用户名”和“密码”,仅对应与该用户和该网站。当用户需要在其它网站发言时,一些网站会使用用户ZeroNet中通用的身份。这个身份可以在ZeroID站点获取。获取该身份后,users.json文件中会有一个“cert”的证书项,用以标识用户的身份。users.json中有一个初始种子,可以根据这个种子生成用户在不同网站的认证信息。一些网站也会给用户添加cert证书信息,但仅适用于该网站。被一般网站认可的身份证明是ZeroID创建的cert信息。
3.3 JSON文件解析
ZeroNet中有两个比较重要的.json文件,分别为content.json和users.json。content.json用于网站的验证,users.json用于用户身份的验证。两个文件的内容分析如下。
图17是一个content.json文件的内容。其中各字段的含义如表4所示。其中sign和signs字段含义一样,sign为保证版本兼容性的保留字段,将在以后的版本中去掉。
图18是一个users.json文件内容,其中各字段的含义如表5所示。
字段内容 | 含义 |
address | 网站地址 |
address_index | BIP32种子的子键,网站克隆时自动添加 |
background-color | 网站背景颜色 |
clone_root | 网站克隆的子目录 |
cloneable | 是否允许被克隆 |
cloned_from | 克隆来源 |
description | 网站描述 |
files | 网站所包含的各文件(文件名/哈希值/大小) |
ignore | 忽略文件 |
includes | 其它content.json |
inner_path | 路径 |
modified | 更改时间 |
postmessage_nonce_security | 发布消息的nonce安全性 |
sign | content.json内容的ECDSA,按键值排序,不包含空格和sign、signer-sign字段 |
signers_sign | 网站私钥签名的地址 |
signs | content.json内容的ECDSA,按键值排序,不包含空格和sign、signer-sign字段 |
signs_required | 需要的签名数量 |
title | 标题 |
translate | 需要翻译的文件 |
viewport | 设备兼容性设置 |
zeronet_version | zeronet版本 |
字段内容 | 含义 |
master_seed | 比特币种子 |
certs | 网站添加的身份证书 |
sites | 所有访问过的网站 |
auth_address | 用户在该网站的身份 |
auth_privatekey | 用户在该网站的私钥 |
auth_type | 认证类型 |
auth_user_name | 认证用户名 |
cert_sign | 证书签名 |
4 常用ZeroNet网站示例
常见的ZeroNet网站有ZeroHello、ZeroName、ZeroBoard、ZeroTalk、ZeroMail和ZeroID等。
ZeroHello是每次打开ZeroNet时弹出的网站,是用户的默认首页。ZeroHello中包括了用户访问过的所有网站的入口,提供了网站浏览以及网站的设置,能查看各网站的缓存信息等,如图19所示。
ZeroName包含了所有的ZeroNet中.bit后缀域名与其对应的网站公钥地址,每次访问.bit域名的ZeroNet站点时都会在本地读取这个数据,相当于HOST文件或DNS功能。网站界面如图20所示。
ZeroBoard是一个匿名发言版,所有人都可以在这里发表任何言论。这里没有国家的限制,发布的消息所有人可见,不能撤回。每个人在一定时间内只能发一条。ZeroBoard界面如图21。
ZeroTalk是一个论坛型的网站,供用户在此发言。这里提供了分语言的模块,供不同语言的用户使用,如图22所示。
ZeroMail是邮件系统,可以给任何以注册的ZeroNet用户发送邮件,如图23。
ZeroID是所有用户注册ZeroNet身份的网站,在此注册后会在users.json文件中写入证书信息。一般的网站都认同ZeroID的身份证书,因此这个证书可以称为是ZeroNet中的“身份证”。ZeroID界面如图24所示。
(本章为中国民航大学 2017 年本科毕业设计(论文)《基于P2P的匿名代理服务器的设计与实现(初稿)》第 2 章,本章完成时间为 2017 年 5 月 19 日。该毕设论文定稿时,本章有大量改动。)