Tor网络原理详解

引入

匿名通信是一种通过采用数据转发、内容加密、流量混淆等措施来隐藏通信内容及关系的隐私保护技术。为了提高通信的匿名性,这些数据转发链路通常由多跳加密代理服务节点构成,而所有这些节点即构成了匿名通信系统(或称匿名通信网络)。匿名通信系统本质上是一种提供匿名通信服务的覆盖网络,可以向普通用户提供Internet匿名访问功能以掩盖其网络通信源和目标,向服务提供商提供隐藏服务机制以实现匿名化的网络服务部署。作为匿名通信系统的核心功能,隐藏服务机制通常利用多跳反向代理或通过资源共享存储来掩盖服务提供商的真实地址,可以保证匿名服务不可追踪和定位。

匿名通信技术的提出源于网络用户的隐私保护需求,但是随之而来的是各种匿名滥用问题。尤为突出的是,一些不法用户基于Tor,I2P,Freenet等匿名通信系统提供的隐藏服务机制,架设必须通过特殊软件或进行特殊配置才能访问的网络服务,形成了无法被直接检索的暗网。术语“DarkWeb”和“Darknet”经常被混用指代暗网。为了更好地厘清这2个术语之间的关系和差异,并界定本文所讨论的暗网的内容,给出如下定义:

  1. DarkWeb:必须通过特殊的软件、特殊的配置才能访问的拥有特殊域名的Web站点,搜索引擎无法对其进行检索。
  2. Darknet:必须通过特殊的软件、特殊的配置才能访问,包含Web、IRC、文件共享等各类资源和服务的匿名网络,搜索引擎无法对其进行检索。

两者的关系如图1所示,其中DarkWeb重点在于不可检索、不可直接访问,并不强调匿名,因此既包含匿名Web站点(如Tor隐藏服务站点),也包含非匿名Web站点(如ZeroNet提供的Web站点);而Darknet则强调匿名性,即所有的资源都需要基于相应的匿名通信系统才能进行访问,其中的资源不限于Web服务。
image.png

Tor匿名通信系统

Tor(the second-generation onion router)是目前使用范围最广的匿名通信系统之一,其核心技术“洋葱路由”在20世纪90年代中期由美国海军研究实验室提出,并在1997年交由美国国防高级研究计划局(DARPA)进一步开发。2003年Tor正式版发布,2004年Tor设计文档在第13届USENIX安全讨论会上正式发表,并在同年由美国海军研究实验室公开其源码。

Tor使用多跳代理机制对用户通信隐私进行保护:首先,客户端使用基于加权随机的路由选择算法分别选择3个中继节点,并逐跳与这些中继节点建立链路。在数据传输过程中,客户端对数据进行3层加密,由各个中继节点依次进行解密。由于中继节点和目的服务器无法同时获知客户端IP地址、目的服务器IP地址以及数据内容,从而保障了用户隐私。Tor于2004年开始支持隐藏服务,为Tor暗网的出现提供了技术支撑。Tor暗网是目前规模最大的暗网之一,其中包含大量的敏感内容与恶意内容。Tor隐藏服务是仅能在Tor暗网中通过特定形式的域名(.onion)访问的网络服务。Tor暗网的基本组件包括客户端、目录服务器(directory server)、隐藏服务目录服务器(hidden service directory)、洋葱路由器(onion router, OR)和隐藏服务器(hidden server),如图2所示。
image.png

  1. 客户端:客户端是运行在用户操作系统上的本地程序,称为洋葱代理(onion proxy, OP)。OP将用户数据封装成Tor信元并层层加密,为各类TCP应用程序提供匿名代理服务。
  2. 洋葱路由器:Tor暗网中的数据中继节点。Tor默认匿名链路由3个OR组成,分别为入口节点(Entry)、中间节点(Middle)和出口节点(Exit),其中入口节点一般选择可信度较高的守护节点(Guard)。
  3. 隐藏服务器:提供Web,IRC等TCP应用服务。隐藏服务器受到Tor匿名性的保护,必须使用Tor客户端才能够访问其TCP应用服务。
  4. 目录服务器:目录服务器保存了所有洋葱路由器的IP地址、带宽等信息。客户端在首次启动后向目录服务器请求洋葱路由器信息,以便完成节点选择和链路建立。
  5. 隐藏服务目录服务器:隐藏服务目录服务器存储并为客户端提供隐藏服务器的引入节点(introduction point, IPO)、公钥等节点信息。

客户端、洋葱路由器、目录服务器、隐藏服务目录服务器和隐藏服务器的功能都集成在Tor软件包中,用户可以通过配置文件对具体功能进行配置。

Tor隐藏服务器在启动时会选择3个引入节点作为其前置代理,并将引入节点及其公钥信息上传至隐藏服务目录服务器。客户端访问隐藏服务时,首先建立3跳链路访问隐藏服务目录服务器,获取引入节点和公钥信息。客户端选择一个汇聚节点(rendezvous point, RPO)作为客户端和隐藏服务器通信链路的汇聚点,并将汇聚节点的信息通过引入节点告知隐藏服务器。客户端和隐藏服务器各自建立到达汇聚节点的链路,完成6跳链路的搭建后即可开始通信。Tor用户通过6跳链路访问隐藏服务器,在此过程中任意节点无法同时获知Tor客户端IP地址、隐藏服务器IP地址以及数据内容,保障了Tor客户端与隐藏服务器的匿名性。

匿名接入技术

匿名接入技术是匿名通信网络为了规避网络监管而提供的客户端隐蔽接入技术。网络监管者出于安全审计的考虑,会检测匿名网络的中继节点并阻止用户接入。为了规避此类网络审查,研究人员提出了各种匿名接入技术,包括bridge,pbfs,meek,FTE,Flashproxy等。

bridge节点

Tor的设计者在2011年提出了bridge节点的概念以突破网络监管。由于此类节点的信息不公开,因此Tor客户端可以将其作为入口节点从而接入匿名网络。
bridge是匿名网络为了提升自身隐蔽性和规避基于IP阻断的网络监管而开发的一种接入机制。bridge节点功能上与一般的Tor中继节点相同,但其信息并未被目录服务器公开,从而降低了被网络监管者发现和阻断的风险。为了方便用户获取此类节点信息,Tor项目提供了2种获取方式:

  1. 在bridgeDB数据库中保存了bridge节点信息,用户可通过直接访问官网站点获取3个bridge节点;
  2. 用户还可通过Google和Yahoo邮箱向指定邮箱发送请求,邮件服务器会自动回复3个bridge节点信息。由于Google和Yahoo申请虚假邮件地址比较困难,所以可有效防止无限制获取bridge节点信息等恶意攻击。

obfs混淆代理

虽然Tor可以使用bridge节点来规避基于IP阻断的监管,但监管者仍能通过深度包检测(deep packet inspection, DPI)技术来识别出Tor流量。鉴于此,Tor项目开发了第1个传输插件obfs混淆代理。Obfs后续又经历了3次版本改进,分别为obfs2,obfs3,obfs4,当前最新版本的Tor使用的是obfs4。其中,obfs2设计于2012年,采用分组密码(AES-CTR-128)对Tor的传输数据进行加密,擦除了Tor流量相关的标识信息,从而实现了有效混淆。但是obfs2在设计上存在2个问题:

  1. 握手阶段的连接容易被识别。通信双方在传输数据之前需要交换秘密信息并协商出会话密钥,而在这一阶段的密钥种子是通过明文传输且报文格式固定,导致这种obfs2流量容易被中间审查机制识别并计算出双方的会话密钥。
  2. 可利用Tor客户端探测bridge节点以检查其是否可进行obfs2握手,从而实施主动的bridge探测攻击。

鉴于上述设计缺陷,Tor后续又推出了obfs3和obfs4方案。作为obfs2的后续设计,obfs3使用Diffie-Hellman协议来计算通信双方的共享秘密,并由此生成对称密钥。相较于obfs2,obfs3在握手阶段有了很大的改进,但其在密钥交换阶段仍然缺乏对bridge身份的验证,存在中间人攻击和主动探测攻击的风险。

为了抵御上述攻击,需要能够有效保证双方通信真实性、完整性和机密性的优化方案。ScrambleSuit提出利用带外方式交换共享秘密实现通信双方的互认证,能够有效防御主动探测攻击。在此基础上,obfs4进一步利用BridgeDB实现了基于bridge身份验证的密钥交换。客户端通过BridgeDB查询bridge节点,获得其IP地址、节点ID和公钥信息。只有同时匹配这3个信息才能通过obfs4节点的身份验证并建立连接。obfs4是对obfs3的重大升级,既有效地混淆了Tor流量,又实现了bridge身份验证,达到能够抵御主动探测攻击和中间人攻击的效果。

meek隐蔽通道构建技术

meek是一种基于前置域(domain fronting)的隐蔽通道构建技术,其工作原理如图7所示。首先,meek-client向前置域名服务器发送一个TLS Client Hello消息,并将该服务器域名填入SNI(server name indication)字段。在TLS握手成功后,meek-client把实际传输的Tor流量封装在HTTP POST载荷中,并将目标bridge地址写入HTTP HOST字段。由于监管者无法查看加密后的HTTP POST内容,因此无法识别真正的目标bridge地址。前置域服务器接收到meek-client数据后,根据HTTP HOST字段值将数据转发到目标bridge节点。该节点上运行的meek-server对HTTP报头处理后将封装的Tor流量转发给后续中继节点。在当前Tor网络中,meek的实现主要依赖于Google,Amazon和Azure等大型服务提供商提供的白名单前置域名服务器,造成Tor客户端在访问正常网站的假象,从而规避网络流量监控。
image.png

FTE加密流量转换技术

FTE(format-transforming encryption)由Dyer等人在2013年ACM计算机与通信安全会议(ACM Conference on Computer and Communications Security, CCS)上发表,其主要原理是通过扩展传统对称加密,将密文转换为指定的传输格式。与obfs流量混淆方式不同,FTE没有将原协议流量转换为无序的未知流量,而是根据用户输入的正则表达式,输出具有一定协议格式的流量。其中,用户输入的正则表达式可以从DPI系统源码中直接提取或根据应用层流量自动学习得到。这使得基于正则表达式的DPI技术会将其误识别为用户选定的协议流量,从而实现规避审查的目的。由于大部分Tor流量为HTTP流量,默认情况下采用HTTP正则表达式将之转化为HTTP协议,从而实现流量伪装。

洋葱匿名路由技术

匿名路由技术是匿名通信系统为用户提供匿名服务时所使用的一种关键技术。该技术具体涉及路由节点选择、链路建立、数据传输等多个阶段。通过匿名路由技术,匿名通信系统的安全和性能都能够得到保障。目前,低延迟匿名通信系统所使用的路由技术主要包括洋葱路由、大蒜路由和基于DHT的路由。

洋葱路由技术的核心思想是通过多跳代理与层层加密的方法为用户的通信隐私提供保护。Tor是最典型的使用洋葱路由技术的匿名通信系统。在Tor暗网中,客户端与隐藏服务器之间需要各自选择3个节点建立多跳链路才能进行通信。目前,Tor主要采用基于加权随机的路由选择算法选择洋葱路由器构建链路。该算法依据服务器描述符(server descriptor)与共识文档(consensus document)中的带宽信息与放缩因子计算各节点的加权值,并按照出口节点、入口节点和中间节点的顺序选择链路节点。值得注意的是,链路中任意2个洋葱路由器应来自不同的C类网段。

在节点选择完成之后,OP从入口节点开始逐跳建立匿名链路,节点之间均采用TLS/SSLv3对链路进行认证。为增强可读性,下面将入口节点、中间节点、出口节点用OR1,OR2,OR3表示。首先,OP与OR1建立TLS链接,即OP发送CELL_CREATE信元,OR1进行响应以完成Diffie-Hellman握手并协商会话密钥 k 1 k_{1} k1,从而建立第1跳链路。其中,CELL_CREATE信元是Tor中一种数据传输的基本单元,长度为512B。然后,OP向OR1发出与OR2建立链路的Tor信元,OR1收到后与OR2建立TLS链路,并通过Diffie-Hellman协议协商OP与OR2之间的会话密钥 k 2 k_{2} k2。OR1将会话密钥通过加密报文告知OP,完成第2跳链路的建立。以此类推,Tor建立多跳链路实现与通信目标的安全连接。

在匿名链路建立后,用户可以通过OP访问公共网络进行数据传输。当OP获得目标服务的IP地址和端口后,使用 k 1 k_{1} k1 k 2 k_{2} k2 k 3 k_{3} k3对数据信元进行层层加密封装,即 { { { < I P : p o r t > } k 3 } k 2 } k 1 \{\{\{<IP:port>\}_{k_{3}}\}_{k_{2}}\}_{k_{1}} {{{<IP:port>}k3}k2}k1,这种加密方式称为“洋葱加密”。该信元经过每个OR节点时,都会被使用对应的密钥对最外层进行解密并转发。当到达OR3后进行最后一次解密,即可识别出目标服务器的IP地址和端口,从而建立TCP连接。在此过程中,用户的上行数据经过OP层层加密,由各OR逐层解密并转发至目标服务器;与此相反,目标服务器的下行数据经过各OR加密,由OP逐层解密并最终返回给应用程序。对于目标服务器来说,Tor用户是透明的,其始终认为自己在和OR3通信,而各OR无法同时获得Tor用户IP、目的服务器IP和应用数据,从而保证了通信的匿名性。

Tor隐藏服务

Tor隐藏服务是通过隐藏服务域名(即洋葱域名)唯一标识和查找的。服务器首次运行后将生成一个隐藏服务域名,其域名形式为.onion。其中是长度为16B的字符串,由RSA公钥Hash值的前80b进行base32编码获得。

image.png

Tor隐藏服务器在启动过程中会将其信息上传至隐藏服务目录服务器,Tor客户端能够通过目录服务器获取足够的信息与隐藏服务器建立双向链路。图2展示了客户端访问隐藏服务的具体过程:

  1. 隐藏服务器选择3个洋葱路由器作为其引入节点,并与引入节点建立3跳链路;
  2. 隐藏服务器将其隐藏服务描述符(hidden service descriptor)上传至隐藏服务目录服务器,描述符中包含引入节点的信息与自身RSA公钥;
  3. 客户端通过隐藏服务域名(.onion)进行访问时,从隐藏服务目录服务器获取引入节点的相关信息;
  4. 客户端选择一个洋葱路由器作为汇聚节点并与该节点建立3跳链路;
  5. 客户端建立到达引入节点的3跳链路,并通过引入节点将汇聚节点的信息发送到隐藏服务器;
  6. 隐藏服务器建立到达汇聚节点的3跳链路,并对该链路进行认证;
  7. 经过汇聚节点,客户端与隐藏服务器通过6跳链路进行交互。

Tor隐藏服务器运行时,将自身的RSA公钥及引入节点信息上传至通过下式选定的6个隐藏服务目录服务器上,其中 H ( x ) H(x) H(x)是结果长度为160b的Hash函数, ∥ \parallel 为拼接函数。
D e s c r i p t o r − i d = H ( P u b l i c − k e y − i d ∥ S e c r e t − i d − p a r t ) Descriptor-id=H(Public-key-id\parallel Secret-id-part) Descriptorid=H(PublickeyidSecretidpart)
其中,Public-key-id即为RSA公钥的SHA1摘要的前80b。Secret-id-part,可计算为
S e c r e t − i d − p a r t = H ( T i m e − p e r i o d ∥ D e s c r i p t o r − c o o k i e ∥ R e p l i c a − i n d e x ) Secret-id-part=H(Time-period\parallel Descriptor-cookie\parallel Replica-index) Secretidpart=H(TimeperiodDescriptorcookieReplicaindex)
其中,Descriptor-cookie为可选字段,该字段可以用来防止未授权客户端访问隐藏服务;Replica-index有2种取值,其作用为选择不同的隐藏服务目录服务器。Time-period字段用于分散隐藏服务重新选择隐藏服务目录服务器的时间,可计算为
T i m e − p e r i o d = t + P [ 0 : 1 ] × 86400 256 86400 Time-period=\frac{t+P[0:1]\times \frac{86400}{256} }{86400} Timeperiod=86400t+P[0:1]×25686400
其中,t为当前的UNIX时间。该字段将一天划分为256个时段,并在其中某个时刻重新选择隐藏服务目录服务器上传信息。

隐藏服务目录服务器利用DHT进行组织,每个目录服务器都是DHT中的一个节点,DHT结构如图12所示。
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/250626.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flask学习四:补充

插件 flask-caching 简介 Flask-Caching 是一个 Flask 扩展&#xff0c;旨在为 Flask 应用程序添加缓存功能。缓存是一种提高应用性能的技术&#xff0c;通过将常用数据暂时存储在一个快速访问的位置&#xff08;如内存或磁盘&#xff09;&#xff0c;从而减少对较慢资源&…

【Nginx】Nginx了解(基础)

文章目录 Nginx产生的原因Nginx简介Nginx的作用反向代理负载均衡策略动静分离 Nginx的Windows下的安装Linux下的安装Nginx常用命令 负载均衡功能演示 Nginx产生的原因 背景 一个公司的项目刚刚上线的时候&#xff0c;并发量小&#xff0c;用户使用的少&#xff0c;所以在低并发…

MIT6.5840-2023-Lab2C: Raft-Persistence

前置知识 见上一篇 Lab2A。 实验内容 实现 RAFT&#xff0c;分为四个 part&#xff1a;leader election、log、persistence、log compaction。 实验环境 OS&#xff1a;WSL-Ubuntu-18.04 golang&#xff1a;go1.17.6 linux/amd64 Part 2C: persistence 大部分的bug都与这…

Datawhale 12月组队学习 leetcode基础 day3 递归

这是一个新的专栏&#xff0c;主要是一些算法的基础&#xff0c;对想要刷leedcode的同学会有一定的帮助&#xff0c;如果在算法学习中遇到了问题&#xff0c;也可以直接评论或者私信博主&#xff0c;一定倾囊相助 进入正题&#xff0c;今天咱们要说的是递归&#xff0c;递归是是…

SpringBoot 自动装配原理---源码详解

目录 SpringBoot 自动装配原理源码流程详解&#xff1a;流程总结&#xff1a;条件匹配解释&#xff1a;其他解释&#xff1a; SpringBoot 自动装配原理 源码流程详解&#xff1a; 1、先看启动类&#xff0c;启动这个main方法&#xff0c;然后调用这个run方法。 2、把 启动类作…

牛客网 DP35 【模板】二维前缀和

代码&#xff1a; import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextInt()) { //…

netty-daxin-3(rpc远程调用)

文章目录 nettyRpcObjectEncoder 与 ObjectDecoderjdk动态代理回顾Rpc调用过程简析服务端客户端 nettyRpc ObjectEncoder 与 ObjectDecoder ObjectEncoder继承自MessageToByteEncoder<Serializable>&#xff0c;它内部使用ByteBufOutputStream包装ByteBuf对象&#xff…

Python 爬虫之简单的爬虫(一)

爬取网页上所有链接 文章目录 爬取网页上所有链接前言一、基本内容二、代码编写1.引入库2.测试网页3.请求网页4.解析网页并保存 三、如何定义请求头&#xff1f;总结 前言 最近也学了点爬虫的东西。今天就先给大家写一个简单的爬虫吧。循序渐进&#xff0c;慢慢来哈哈哈哈哈哈…

TrustGeo代码理解(一)main.py

代码链接:https://github.com/ICDM-UESTC/TrustGeo 一、导入各种模块和数据库 # -*- coding: utf-8 -*- import torch.nnfrom lib.utils import * import argparse, os import numpy as np import random from lib.model import * import copy from thop import profile imp…

devc++如何建立一个c++项目?devc++提示源文件未编译?

打开devc APP后是这样的界面&#xff1b; 点击文件-> 新建->项目&#xff0c;这一点应该不难&#xff0c;主要是最后这个选择什么&#xff1f; 这样即可。 devc提示源文件未编译&#xff1f; 点击工具->编译选项&#xff1b; 如果不能解决&#xff0c;那就是可能路径…

NNDL 循环神经网络-梯度爆炸实验 [HBU]

目录 6.2.1 梯度打印函数 6.2.2 复现梯度爆炸现象 6.2.3 使用梯度截断解决梯度爆炸问题 【思考题】梯度截断解决梯度爆炸问题的原理是什么&#xff1f; 总结 前言&#xff1a; 造成简单循环网络较难建模长程依赖问题的原因有两个&#xff1a;梯度爆炸和梯度消失。 循环…

代码随想录算法训练营第53天| 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划

JAVA代码编写 1143.最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情…

软件测试面试八股文(答案解析+视频教程)

1、B/S架构和C/S架构区别 B/S 只需要有操作系统和浏览器就行&#xff0c;可以实现跨平台&#xff0c;客户端零维护&#xff0c;维护成本低&#xff0c;但是个性化能力低&#xff0c;响应速度较慢。 C/S响应速度快&#xff0c;安全性强&#xff0c;一般应用于局域网中&#xf…

【华为数据之道学习笔记】3-10元数据管理架构及策略

元数据管理架构包括产生元数据、采集元数据、注册元数据和运 维元数据。 产生元数据&#xff1a; 制定元数据管理相关流程与规范的落地方案&#xff0c;在IT产品开发过程中实现业务元数据与技术元数据的连接。 采集元数据&#xff1a; 通过统一的元模型从各类IT系统中自动采集元…

Linux下FFmepg使用

1.命令行录一段wav,PCM数据 ffmpeg -f alsa -i hw:0,0 xxx.wav//录制 ffplay out.wav//播放ffmpeg -f alsa -i hw:0,0 -ar 16000 -channels 1 -f s16le 1.pcm ffplay -ar 16000 -channels 1 -f s16le 1.pcm -ar freq 设置音频采样率 -ac channels 设置通道 缺省为1 2.将pcm…

002.Java实现两数相加

题意 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示两数之和的新链表。 示例 输入&#xff1a;l1[2,4,3],l2[5,6,4] 输出…

【从零开始学习JVM | 第七篇】深入了解 堆回收

前言&#xff1a; Java堆作为内存管理中最核心的一部分&#xff0c;承担着对象实例的存储和管理任务。堆内存的高效使用对于保障程序的性能和稳定性至关重要。因此&#xff0c;深入理解Java堆回收的原理、机制和优化策略&#xff0c;对于Java开发人员具有重要的意义。 本文旨在…

springcloud-分布式缓存

文章目录 一.Redis持久化1.RDB持久化2.AOF持久化 二.Redis主从1.搭建主从架构2.全量同步3.增量同步 三.Redis哨兵1.哨兵的作用和原理2.搭建哨兵架构3.RedisTemplate的哨兵模式 四.Redis分片集群1.搭建分片集群2.散列插槽3.集群伸缩4.故障转移5.RedisTemplate访问分片集群 为什么…

树莓派(Raspberry Pi)4B密码忘记了,怎么办?

树莓派长时间不用&#xff0c;导致密码忘记了&#xff0c;这可咋整&#xff1f; 第1步&#xff1a;取出SD卡 将树莓派关机&#xff0c;移除sd卡&#xff0c;使用读卡器&#xff0c;插入到你的电脑。 第2步&#xff1a;编辑 cmdline.txt 在PC上打开SD卡根目录&#xff0c;启动…

Kotlin ArrayList类型toTypedArray转换Array

Kotlin ArrayList类型toTypedArray转换Array data class Point(val x: Float, val y: Float)fun array_test(points: ArrayList<Array<Point>>) {points.forEachIndexed { idx, ap ->ap.forEach {print("$idx $it ")}println()} }fun main(args: Arra…