1. 引言
随着Internet应用的发展,匿名通信技术在保护个人隐私方面发挥着非常重要的作用。匿名通信的目的是隐藏每个最终用户的机密信息,包括身份和内容,并避免被第三方观察和发现。但是,对于匿名通信系统,匿名和通信效率一直是一种权衡。通常,系统具有更好的匿名性,通信效率越差。这是因为匿名增强通常伴随着通信过程的复杂性,这也将导致通信效率的降低。因此,如何满足不同用户的个性化需求已成为匿名通信系统的热门话题。
匿名网络通过将其数据中继到多个匿名节点,每个节点修改、填充和转发数据包,使得消息通过从发送者到接收者的若干节点,以便匿名地到达最终目的地来为用户提供隐私,通过多层加密用于保护用户的隐私免受攻击,从而实现对身份和通信关系的保护。Tor和I2P是匿名网络的典型代表,它们允许用户访问不同的服务,同时保留其在线匿名性,其中用户的真实身份与其指定系统的身份分离。
Tor和I2P的设计理念区别关键在于:I2P试图将现有的互联网服务转移到I2P网络,并在框架内提供服务实现,而Tor则允许匿名访问分别实施和操作外部的互联网服务。因此,Tor是一个“覆盖网络”,而I2P是一个“虚拟互联网”。
2. Tor和I2P网络
Tor和I2P网络有相似之处和不同之处 [1]。这两个匿名服务的共同目标是通过使用多层加密,将流量中继到多个站点来提供匿名性,多层加密用于强化和拒绝用户与其消息之间的链接。Tor主要致力于为用户提供匿名访问网络以外的网站,而I2P提供匿名访问在I2P网络本身内私下托管的网站。与此同时,Tor还在Tor网络中托管了网站(隐藏服务),而I2P支持访问Internet上托管的网站,但不支持使用外部代理访问I2P网络 [2]。就用于中继流量的路径而言,Tor网络和I2P网络上的路径发生变化并且不固定,用户将保持连接到一个路径(电路隧道级联)的持续时间根据匿名系统而不同。两种匿名服务的路由技术和路径选择也不同。
2.1. Tor和I2P的匿名
作为最受欢迎的匿名通信系统Tor和I2P,通过其加密和通信方案提供强大的匿名性 [3]。
基于电路的通信是Tor匿名的核心 [4],其中Tor用户(Tor节点)的身份与Tor应用程序的身份分离。Tor匿名是基于“集中式目录”、“全双工电路”、“洋葱路由”,隐私保护是通过“消息”、“电路交换”而实现的,密码规格使用流密码(AES128)、公钥密码(RSA1024,固定指数65537)、Diffie-Hellman协议(1024位安全素数)和散列函数(SHA1)。Tor支持两种操作模式:第一种操作模式“Web代理”或“Service proxy”,它允许与非Tor启用的系统(普通的Internet)进行传统通信;第二种操作模式称为“隐藏服务”,它消除了与普通Internet的传统通信,Tor确保传输到网络中的数据永远不会离开混合,这意味着只能访问参与此类网络的服务,并且Tor内的用户对于TCP/IP的2~4层上可用的信息完全是匿名的 [5]。
基于隧道的通信是I2P匿名的核心 [4],I2P的匿名性在于将用户的身份(由路由器信息提供)与其正在运行的应用程序(由其租赁集提供)分离。通过“分布式目录”、“单向隧道”、“大蒜路由”、“细胞”、“分组交换”而实现匿名和隐私保护,密码规格使用流密码(AES256-CBC)、公钥密码(ElGamal2048,DSA1024)、Diffie-Hellman协议(2048位安全素数)和散列函数(SHA256)。由于I2P网络可以集成各种应用程序,同时可以匿名的提供全部典型的Internet应用,所以I2P只提供“隐藏服务”一种操作模式 [6]。I2P也可以通过“out proxies”提供对公共互联网的直接访问,该功能由各种内部服务提供,主要目的是代理访问其他匿名系统。
Tor、I2P的域名、节点和路由器采用了与位置无关的标识符(服务描述符–隐藏服务)加密密钥标识。
1) 域名生成算法步骤如图1所示。
Figure 1. Algorithm process of anonymous domain generation
图1. 匿名域名生成算法流程
由于域名是公钥的一部分,保证了网站的匿名性和安全性,可以提供隐藏服务。
2) I2P中的节点标识符、路由标识符计算公式为:NetDB中的节点标识符Node_ID=SHA1(IP Number) || Random,路由标识符Routing_id = SHA256(Node_ID || 时间戳)。
Node ID和Route ID的生成算法关键程序如下:
public void ipDeal(ip){
if(ipv4){
long=iptolong(ipv4);
binStr=ip.toBinaryString(long);
randStr=rand.generateString(128);
}else if(ipv6){
big=ipv6toInt(ip);
binStr=big.toString(2);
randStr=rand.generateString(32);
}
result=binStr.concat(randStr);
sha1=DigestUtils.sha1Hex(result);
Str=result.concat(timestamp);
sha256=DigestUtils.sha256Hex(Str)
}
在生成Node ID的时候,首先将IP地址(IPv4或IPv6)转化为十进制数,然后再转化为二进制数,当得到的二进制数不足32位(或128位)时,在二进制数的左边补0,然后与用随机数发生器产生128位(或32位)的随机数“凑合”,再采用SHA1生成160位的Node ID;再将Node ID与时间戳“凑合”,采用SHA256加密得到Route ID。
在创建Node ID和Route ID时,由于Node ID为160位,Route ID的位数为256位,160位的Node ID与时间戳、随机数发生器产生的随机数“凑合”,组成256位的Route ID,这样保证了路由器IP地址的匿名性和动态性,同时增加了攻击者的难度。
2.2. Tor和I2P的体系结构
1) Tor系统架构和协议层次
Tor是用C语言编写的匿名P2P网络的多应用程序,图2表示了Tor网络体系结构、协议层次模型。
Figure 2. Tor protocol hierarchy model
图2. Tor协议层次模型
在图2中,Tor层是Tor网络的关键部分,由Tor路由节点建立通信电路,可以将其看作为代理服务器,是它将客户端数据传输到网络中,并从网络中获取服务器端数据。应用层主要有应用代理和退出的连接功能;Tor协议层主要有洋葱路由、电路创建协议;传输层有TCP、SSL/TLS协议,TLS的主要功能是用于电路的加密。
2) I2P系统架构和协议层次
I2P是用Java编写的匿名P2P网络的多应用程序框架 [12],图3概述了I2P架构、I2P协议层次模型。
Figure 3. I2P protocol hierarchy model
图3. I2P协议层次模型
I2P框架的核心是I2P路由器,它是I2P协议的关键组件。I2P是围绕所谓的I2P路由器构建的应用程序框架(或中间件层),路由器是一个在主机上运行的软件组件,为本地I2P应用程序提供连接,应用程序可以访问隐藏服务(作为客户端),也可以托管服务(作为服务器)。应用程序之间的连接通过完全分散的对等网络实现,该网络作为IP上的覆盖层运行。应用程序可以使用称为NTCP的类TCP协议,也可以使用称为SSU的类UDP协议,路由器将这些连接映射到基于数据包的I2P隧道,这些I2P隧道使用标准大蒜路由提供匿名性,隧道由链中最外层的对等体和唯一的Tunnel ID标识。
3) Tor和I2P架构比较
Tor和I2P架构体现了两个匿名网络的设计理念差别,Tor允许匿名访问分别实施和操作外部的互联网服务,解决“匿名性”和“隐藏服务”,侧重应用层设计,构建了一个“覆盖网络”。I2P试图将现有的互联网服务转移到I2P网络,并在框架内提供服务实现,提供匿名文件共享和匿名网络托管,解决“匿名性”、“隐藏服务”和“安全性”,侧重网络层设计,构建了一个“虚拟互联网” [7]。
2.3. 工作流程
1) Tor工作流程
图4说明了Tor网络的工作流程,用户可以通过搜索Tor目录服务器或网桥登录Tor网络。
2) I2P工作流程
图5说明了I2P网络的工作流程,用户可以通过搜索I2P NetDB的路由器联系信息和目的地联系信息登录I2P网络。
由图4、图5的工作流程对比可以看出,Tor围绕可信赖的权威服务器构建进行集中式设计。这些服务器中的每一个都跟踪网络中的所有节点及其性能。权限服务器定期发布此列表供客户端使用。客户端从此列表中选择节点以创建加密隧道,直到它们到达出口节点。然后,这些出口节点充当代理,允许Tor用户访问公共Internet (称为clearnet),而不会泄露其身份。由于只有少数可信任的授权服务器,因此这些节点的完整性对整个网络至关重要,使其成为攻击的重要目标。此外,由于所有权威机构都需要跟踪整个网络并定期就其状态达成一致,因此该设计的可扩展性有限。
用户使用I2P时,首先访问分布式数据库NetDB,NetDB保留两种类型的记录:路由器联系信息和目的地联系信息,路由器联系信息存储在RouterInfo结构中,该结构包含到达对等方所需的信息:路由器标识、IP地址、端口、公钥等。leaseSets结构中存储目的地信息,该结构包含:隧道网关路由器标识符、域名标识符、公钥等。如果应用程序想要访问I2P服务,首先需要找到该服务,它要求路由器提供服务信息,路由器可以在本地存储该服务信息并且能够立即将其返回给应用程序。
3. Tor与I2P的关键技术
由于Tor与I2P在开发理念不完全相同,因此两个网络在一些网络关键技术上存在差异 [8] [9],表1列出了Tor与I2P在关键技术上的差异,这直接影响了网络的功能与性能。
Table 1. Tor vs I2P: key technologies
表1. Tor和I2P比较:关键技术
3.1. 接口技术
Tor使用Socket Secure (SOCKS)接口,因此SOCKS能够感知应用程序,可以很容易地指向Tor软件,这表明,采用SOCKS的应用程序无需任何更改,可以直接使用。另一方面,I2P是一个中间件,提供应用程序可用于通过网络进行通信的API,这意味着应用程序需要进行复杂地调整。SOCKS与I2P API,极大地改变了构建使用I2P或Tor网络,通过Internet进行匿名通信的应用程序的工作量和能力。SOCKS接口只能通过TCP传输消息,而I2P可以在UDP和TCP之间进行选择,这可以使I2P在使用某些应用程序时提供更好的性能。
Tor主要是为匿名访问公共互联网而设计的,因此它设计了许多退出节点和代理,而I2P网络的核心设计目标是允许匿名托管服务(隐藏服务),并不是专注于匿名访问公共互联网。I2P可以通过“out proxies”提供对公共互联网的直接访问,但该功能由各种内部服务提供,以代理到其他匿名系统 [10]。
I2P API专为匿名和安全而设计,而SOCKS专为功能而设计。在I2P中,确保总安全性不会检测到客户端活动。
Tor使用SOCKS有两个缺点:
1) SOCKS接口只能通过TCP传输消息,而I2P可以在UDP和TCP之间进行选择,这可以使I2P在使用某些应用程序时提供更好的性能。
2) 应用程序发送的消息可能仍包含可识别发件人的信息。为了防止这种情况,需要使用具有过滤功能的应用程序级代理Privoxy。
3.2. 隧道技术
Tor是通过“电路”双向传递消息的,即:入站和出站消息是同一条电路,如图6所示;而I2P是通过“隧道”单向传递消息,即入站和出站消息是不同的两条隧道,并且这两条隧道每隔10 min重新建立,如图7所示。Tor的出站端点是公开的,未隐藏,而I2P的出站端点被隐藏。
基于电路或隧道的通信是Tor或I2P匿名的核心,其中I2P用户(I2P路由器)的身份与I2P应用程序的身份分离。从匿名的角度看,I2P的单工隧道暴露的流量数据,是Tor的双工电路暴露的一半,而在I2P中,构成请求的数据包将通过一个或多个出站隧道传出,构成响应的数据包将通过一个或多个不同的入站隧道返回。
Tor依靠志愿者提供的服务器来构建电路,但I2P使用具有足够性能特征的对等体参与网络来构建隧道。从技术角度来看,由于具有更好的内存管理和低客户端带宽开销,Tor显得更高效,但在I2P中实现了性能排名机制、允许分析节点的实际性能等,I2P服务比Tor中的隐藏服务更快。
在Tor中,由于缺少覆盖流量,攻击者可能会使用流量分析和定时攻击来监控流量模式,跟踪消息流并识别通信方。I2P隧道中的跳数在0到7之间变化,其中隧道中的更多跳数会增加匿名性,但因为数据需要遍历更多中间节点会降低性能 [11]。
3.3. 对等体选择
Tor和I2P都运行特定的节点选择算法,以提高性能并防范攻击者。Tor是基于带宽的对等体(Peers)选择,I2P是基于性能的对等体选择。对等体选择的目的是快速地构建电路或隧道 [12]。
在Tor网络中,它的目录服务器使用有源带宽探测来测量和记录每个OR (Onion Routers)能够提供的带宽,如果没有针对此特定OR的探测数据,Tor还必须依赖各自发布的带宽值,带宽信息用于以加权概率方式选择中间路由器和出口路由器。Tor客户端使用路径选择算法来选择用于构建电路的OR,只要测量值可用就优先采用,Tor中的所有其他OR都选择时的概率与其带宽成正比。这意味着仅考虑带宽,而忽略其他属性(如OR的实际位置)。
在I2P网络中,I2P客户端依赖于先前监控的性能值和网络的当前状态,不使用有效带宽探测。I2P节点选择算法,能够非常快速地对失败的对等体和网络拓扑中的其他变化做出反应,通过不断分析和排名性能来选择对等体,而不是信任所声称的容量。
由于Tor在选择OR时仅考虑带宽,而忽略其他属性(如OR的实际位置、时延),这可能导致高延迟和网络的负载不均衡,现有资源可能无法得到最佳利用。在I2P中,由于隧道的生命周期较短,一些I2P用户很可能会使用一个或多个损坏的对等体来构建隧道,快速响应故障节点的这种行为存在安全问题,同时,I2P在选择对等体时也不考虑I2P对等体的位置,这会导致高时延,所构建的隧道也不是最佳的。
3.4. Tor目录服务器与I2P NetDB
Tor和I2P的主要区别在于两个网络如何管理参与者。Tor和I2P都使用目录来存储网络元数据,即:维护网络运行所需的元数据(参与者或应用程序的信息、部署在网络中的服务) [10] [13]。
Tor使用中央服务器目录协调其Tor节点,该目录包含每个列出的OR (Onion Router)的路由器描述符和网络状态文档,每个OR还维护两个密钥:一个长期身份密钥,用于签署TLS证书、路由器描述符和目录;一个短期的洋葱密钥,用于解密用户建立电路的请求并协商短期对称密钥。路由器描述符唯一地标识每个OR(Onion Router)并包含要联系的所有相关数据:公钥、IP地址、带宽、退出策略等,网络状态文档包含OR的测量带宽,提供网络的整体视图和统计检索。
I2P网络使用分布式目录协调其I2P路由器,基于分布式Kademlia数据库和用于对等选择的对等分析算法,构建具有自组织的网络数据库NetDB,协调和存储所有系统元数据。I2P的NetDB存储由Leasesets和Routerinfos组成的网络元数据,它是一个分布式哈希表,由填充节点组成。由于Floodfill节点是具有高带宽速率的普通I2P路由器,因此NetDB不是由整个网络构成的,而是仅由所有I2P路由器的子集构成。有关I2P路由器的信息收集在称为Routerinfo的结构中,该数据结构保存该特定I2P路由器的所有联系信息。I2P应用程序不是通过普通的 < IP地址,端口号 > 元组来识别,而是通过与位置无关的标识符(称为I2P目标)来识别。I2P目的地连同一组加密密钥(用于将加密数据发送到应用程序)、签名密钥和用于接收数据的网关列表收集在称为Leaseset的结构中。I2P路由器由Routerinfo标识,而I2P应用程序由租赁集Leaseset标识。
集中式架构存在单点故障的风险,I2P使用分布式哈希表(DHT),每个对等方负责分析其他路由器,以确定如何最好地利用可用资源,分布式组件可以加强网络并使其更有弹性,同时分布式架构系统消除了单点故障风险。
3.5. 路由方法
由图8、图9对比可知,Tor和I2P网络有相似之处和不同之处。这两个匿名服务的共同目标是通过使用多层加密,将流量中继到多个站点来提供匿名性,多层加密用于强化和拒绝用户与其消息之间的链接。就用于中继流量的路径而言,Tor网络和I2P网络上的路径发生变化并且不固定,用户将保持连接到一个路径(电路隧道级联)的持续时间根据匿名系统的不同而不同,两种匿名服务的路由技术和路径选择也不同 [14]。
洋葱路由的目的是让对手更难以进行流量分析,同时首先要保护两个与第三方相互认识的参与者的不可链接性,其次是保护身份。由图8可知,只有电路中的第一个OR知道客户端的IP地址,并且只有电路的最后一个OR知道消息的接收者,所有中间OR只知道它的前身及其后继者,甚至不知道哪些其他OR正在参与电路,通过三个节点间的双向电路构成网络。由于缺少覆盖流量,攻击者可能会使用流量分析和定时攻击来监控流量模式,跟踪消息流并识别通信方。
大蒜路由是洋葱路由的扩展,消息通过使用分层加密的几个中间节点,从其始发者路由到最终端点。由图9可知,通过单向隧道将I2P路由器连接起来,每个隧道由网关(入口点),一组参与者(中间节点)和一个端点组成,隧道中的I2P路由器均不知道客户端的IP地址和消息的接收者,构成输入隧道和输出隧道的I2P路由器至少有6个。由于所有的I2P流量均在网络内部,因此I2P具有很强的匿名性和对抗“流量分析”、“Sybil攻击”的能力。
大蒜路由与洋葱路由非常相似,但其技术上存在一些差异。一是大蒜路由中,可以聚合多条消息,二是大蒜路由中隧道是单向的。
I2P中的大蒜路由主要采用三个不同的阶段:一是通过单向隧道构建路由(分层加密);二是对于消息进行捆绑,通过分组交换,确定端到端消息传递的成功或失败;三是用于发布一些网络数据库NetDB条目,进行数据库维护。
3.6. 消息机制和交换方法
如图10所示,Tor协议中的协议数据交换使用的是固定长度的Cell,流量在网络中以固定大小的单元进行传输,每个单元是包含头和有效载荷的12字节数据。头包括一个线路标识符(这个单元使用哪条线路)和一个指令(指明将要对这个单元的数据做什么)。中继单元在有效载荷数据之前有额外的头(中继头),包含了一个stream ID、一个端到端的校验和、中继负载的长度和一个中继命令。
Figure 10. Cell structure of the tor network
图10. Tor网络的Cell结构
Figure 11. Message structure of the I2P network
图11. I2P网络的message结构
在图11中,I2P网络内的信息以I2NP (I2P网络协议)消息的形式交换,主要由传送指令和有效载荷组成,由于大小限制,它可以包含整个消息或仅包含部分消息。为了防止定时攻击,收集特定路由器的多个消息并将其组合成所谓的隧道消息。此消息包含该路由器的ID,用于加密有效负载的IV和有效负载本身,其中包含校验和、填充以及路由器收集的消息,格式为“交付说明”消息)和I2NP本身(称为“Clove”)。
同一个连接中的指令与数据,在Tor中沿着通过TCP协议建立的电路(Ciruit)流动至目的节点,而在I2P中,连接被消息机制(Message)打散为数据包,经由不同的TCP或UDP隧道(Tunnel)交叉传输后,在接收方重组为数据流,即:I2P基于包(分组)切换而Tor基于电路切换。因此,Tor经常应对高拥塞导致高延迟,而在I2P中,分组交换导致一些隐式负载平衡,并有助于避免拥塞和服务中断。这对于大型文件传输尤为重要,因此I2P更适合此类用途。
I2P网络中的所有对等体经常发送消息(端到端和网络维护消息),端到端消息沿其路径改变大小和数据,路由器间通信既加密又流式传输(使得两个1024字节的消息与一个2048字节的消息无法区分),所以外部攻击者也无法访问消息。
虽然Tor和I2P都使用分层和有序路径(隧道和电路/流),Tor是一个电路交换网络,但I2P是一个分组交换网络,允许I2P透明地路由拥塞或其他网络故障、操作冗余路径,并跨可用资源负载平衡数据 [14]。
3.7. 退出节点和隐藏服务
Tor网络中有许多退出节点,针对具有大量出口路由器的出口流量进行了优化和设计,主要原因是由于其设计理念决定的:Tor主要致力于为用户提供匿名访问网络以外的(Internet)网站,同时还在Tor网络中托管了网站(隐藏服务)。
但在I2P中,只有少数Outproxies (Tor术语中的退出节点)作为标准Internet的网关运行,这主要也是I2P网络设计理念决定的:I2P专为I2P网络内的匿名通信而设计,I2P提供多种应用程序,同时也在I2P网络中托管了部分网站(隐藏服务),所提供的服务几乎覆盖了整个Internet,所以它的代理很少。
当使用实时交互式服务时,Tor和I2P都试图提供具有低延迟的强匿名性。由于Tor与I2P相比具有更多的退出节点,这些退出节点易于受到攻击,因此其安全性较差。
Tor与I2P都构建了匿名服务,I2P现有的应用几乎包括了绝大部分典型的因特网应用,但Tor提供的隐藏服务在外置服务器上,而I2P提供的隐藏服务在内置服务器上,Tor的规范用法是访问外部服务 [15],而I2P规范用法是访问内部服务 [16]。
3.8. TCP/UDP传输
由于Tor网络中的节点间(除出口节点与服务器)使用TLS进行加密连接构建电路,TLS用于防止可能的攻击者修改数据,冒充洋葱路由器,提高网络效率和安全。Tor使用SOCKS接口与Internet进行交互,提高用户的匿名性。但TLS、SOCKS都是基于TCP协议的,所以Tor的中继之间使用TCP连接,并且多个TCP流可以共享一个虚电路,每个OR都使用TLS连接到其他的OR。
而在I2P网络中,节点间全部使用TLS进行加密连接构建隧道,节点发现使用Kademlia的XOR距离算法。TLS、Kademlia分别基于TCP和UDP,所以I2P的路由之间既使用TCP连接又使用UDP进行数据传输。I2P的传输连接是两个对等传输协议NTCP和SSU,NTCP是基于NIO的TCP,SSU是安全半可靠的UDP(它的主要目的是通过隧道安全地传输I2NP消息,仅加密UDP功能)。I2P同时使用TCP和UDP传输,对于某些深度包检测(DPI)设备来说,UDP可能更难以跟踪。
I2P能够使用TCP以及不可靠的UDP进行传输,因此,I2P会话的设置速度比Tor隐藏的服务会话更快,并且具有更低的延迟 [17]。
4. 结束语
匿名网络I2P是基于Tor的,它们之间有许多相似之处:基于TCP/IP的覆盖网络、提供低延迟匿名服务、三层加密消息、大蒜路由是洋葱路由的变种、密码规格基本相同等,但由于它们设计理念存在本质差异,同时针对Tor存在的安全问题,I2P在匿名性、隐私性、安全性、隐藏服务等方面进行了扩展或升级 [18] :分布式网络数据库代替了集中式目录服务器,克服了网络单点故障隐患,可扩展性好;单向隧道代替了双向电路,匿名性更强;分组交换代替了电路交换,更好地平衡网络中的数据,有助于避免拥塞和服务中断;消息(消息捆绑)代替了细胞,可有效对付流量分析攻击;大蒜路由代替了洋葱路由,提高了匿名性和安全性;完全的端到端通信代替了局部的端到端通信,提高了通信的整体安全性;同时支持TCP和UDP传输代替了单一的TCP传输,提高了会话速度;很少的代理和出口节点代替了较多的代理和出口节点,网络流量保持在网络内部,有效地防止流量分析攻击和DoS攻击;按性能的路由器选择代替了按带宽的节点选择,可以有效地利用网络资源;ElGamal1024/SHA256/DHE/BASE64的分层加密代替了RSA1024/SHA1/AES/BASE32的分层加密,提高了数据传输和隐藏服务的安全性、用户的匿名性;允许匿名托管服务代替了匿名访问互联网,减少了出口节点,保护用户和网络的安全。
I2P受到与Tor相似的威胁,虽然I2P网络根据“威胁模型”,对DoS攻击、流量分析、时间攻击等威胁进行了防御设计,但是针对I2P网络的攻击依然层出不穷。
LIN YE [19] 、C. Egger [20] 、Juan Pablo Timpana-ro等人 [21] [22] 的研究表明,I2P的隐藏服务面临去匿名化风险、分布式哈希表(DHT)的NetDB存在安全隐患等,I2P还需要进一步提高健壮性、可扩展性、匿名性和安全性。
基金项目
国家自然科学基金(No. 61872312)、江苏省产学研前瞻性联合项目(BY2016069-16)。
NOTES
*通讯作者。