Tor源码分析七 -- 握手协议

Tor源码分析十 -- 连接和链路 源码分析到这个部分,为了让大家明白源码中的编码逻辑,不得不开始从头梳理程序内部的复杂连接和链接组织形式。否则大家后期会更加一头雾水。笔者开始分析源码之时,没有这些宏观的概念,只能死嚼代码,硬猜硬想,再加以检查代码进行验证,才得以明白程序的主要框架逻辑。如果再以猜测验证的模式向大家讲述源码,必定会越来越混乱。所以,在本节之中,我们会将系统中所有的连接类型,链路类型和他们之间的关系和代码之中的关联方式 阅读详情

  本节主要讲述Tor系统中所用到的握手协议。握手协议分三层:TCP握手;TLS握手;Tor握手。其中Tor握手又分为三个层次:OR握手;链路建立;流建立。

  TCP的三次握手我想应该学计算机方向的朋友无人不知了,所以此处就略去。而TLS是SSL的升级版本,其握手过程与SSLv3几乎一致。同时由于TLS根据客户端的不同握手选择,会有些许握手过程中的差别,我们希望大家能够找到TLS相关的书籍翻阅。此处就不再过多的叙述TLS的握手过程。

  本文的重心着眼于描述Tor握手全过程,更甚者是描述整个Tor协议。协议的主要内容包括协议使用的主要数据结构,连接的建立和初始化,连接的协商,链路管理,流管理以及流量控制等部分。在本文描述完全之后,大家会有个对Tor系统中结点之间如何进行交流的一个比较完整的印象。当然,可以说本文中几乎全部内容都来自tor-spec.txt,也就是Tor Protocol Specification。有兴趣的朋友可以参看原文,原文必定比笔者讲的要详细清楚。


1. 系统概述

  Tor是一个用以保证用户匿名性的分布式网络。其主要的服务对象是用户所使用的基于TCP连接的应用。在使用Tor系统之时,客户端会选择一系列的结点建立Tor链路。链路中的结点,只知道其前继结点和后继结点,不知道链路中的其他结点信息。这样从某种程度上保证了坏结点存在对链路匿名性的破坏。链路中的数据流是以Cell数据包的形式进行传输的。Cell数据包的负载符合洋葱路由的特性,即由原点出发的负载被多层加密,传输过程中被层层解密;而由出口结点返回的数据在传输过程中层层加密,到原点后由原点一次性解密。而在这个加解密过程中所使用到的密钥,则是由Tor协议提供机制来协商生成的。下面先简要描述系统中所使用到的最常见的密钥:

  1)Identity Key(非对称密钥的公钥):系统中的结点均有其自身所对应的ID密钥,该密钥的作用是用以证书签名或标识路由身份。实际上,在前面的文章中我们也提到过,Tor结点根据自身的身份不同,会使用不同的Identity Key。但是,要说明的是,在目录服务器已注册的结点,不可以随意更改其Identity Key,否则就无法正常提供服务。

  2)Onion Key(非对称密钥的公钥):系统中提供中继服务的结点,即OR结点,均有一个比ID密钥更短期的一周一换的洋葱密钥。该密钥的主要作用是用来保护OP与OR之间进行DH密钥交换协议的前半部分信息(g^x)的安全性。利用Onion Key,OP与OR之间可以教安全的实行DH密钥交换协议从而协商出洋葱对称密钥。

  3)Connection Key(对称密钥):洋葱对称密钥,是OP与各个OR之间协商的临时对称密钥,用来完成上文中叙述的层层加解密功能。

  另外,由于结点之间的通信都是由TLS连接来保障的,所以必定会在TLS那个层次中有一对保障TLS通信安全的对称密钥。这并非Tor系统所关心的密钥,所以略去。

  注:这个部分的说明和Tor Protocol Specification之中的说明或许有所不同,大家请自行参照更多其它材料来进行分析。最终目标就是理解整个Tor系统的密钥组织结构及其使用。下面会再对整个系统的密码学相关过程做更详细的分析。


  

  

  上图中给出了Tor系统建立链路的整个过程,下面我们对它进行深入的分析。

  1. Alice(OP)开启Tor系统之后,需要建立第一条可用链路,她选择了OR1作为链路第一跳,并与OR1建立起了TLS连接;(TLS的建立与上层系统关系极小)

  2. Alice成功与OR1建立TLS连接之后,他们之间的通信就是被TLS连接保障的加密通信。此时,Alice开始执行Tor握手协议第一步:OR握手;(OR握手的过程图中并未给出,而此过程与TLS握手密切相关,我们可以暂且认为OR握手就包含于TLS握手之中)

  3. Alice成功与OR1完成OR握手之后,他们相互之间交换了彼此的信息。此时,Alice开始执行Tor握手协议第二步:链路建立;

    1)Tor协议中的协议数据交换使用的是固定长度的Cell,以下为Cell的简单框图:

      实际上现有版本的Cell结构已经发生了些许改变,但是此处我们用最原始的Cell结构进行说明。下面我们用稍微形式化的方式来描述上述结构:


      Cell  ::=  Control Cell  |  Relay Cell


      Control Cell  ::=  Control Header  ||  Control Payload                                Length = 2B + 1B + 509B = 512B

      Control Header  ::=  CircID  ||  Control CMD                                              Length = 2B + 1B = 3B

      Control Payload  ::=  Control DATA                                                           Length = 509B

      Control CMD ::=  padding  |  create  |  created  |  relay  |  destory             Length = 1B


      Relay Cell  ::=  Control Header  ||  Relay Header  ||  Relay Payload         Length = 3B + 11B + 498B = 512B

      Relay Header  ::=  StreamID  ||  Digest  ||  Len  ||  Relay CMD                 Length = 2B + 6B + 2B + 1B = 11B

      Relay Payload  ::=  Relay DATA                        

Tor源码 -- core分析 tor coreor connectioncircuitstream or connection or connection负责op与or或者or与or的连接(两个主机之间的连接)。 包括TLS连接,handshake等等。 到目前为止, tor有3种握手方式:certificate up-front, renegotiation, in-protocol. or_connection_st.h声明了or connection数据类型,connection_or.c文件有操作函数。 circuit stre 阅读详情

相关推荐

Tor源码分析八 -- 客户端执行流程(second_elapsed_callback函数)

在之前的客户端源码分析中,我们讲述了整个客户端的事件集和相关调度规则。每一类事件的激活都有相应的条件,要么是socket可读写,要么是收到信号,要么是定时事件到达,还有手动的事件激活。总而言之,系统中添加的所有事件经过Libevent的调度,使得整个系统有条不紊的运行起来。同时,每个事件均有其对应的事件处理函数,在系统运行起来之后,一旦事件被激活,就会调用相应的回调函数进行处理。   本文我们着

WInScar的专栏 3483

Tor源码分析 -- 附录 Tor Manual

TOR(1) Manual Page Analysis NAME tor - The second-generation onion router SYNOPSIS tor [OPTION value]… DESCRIPTION tor is a connection-oriented anonymizing communication service. Use

WInScar的专栏 5570

Tor源码分析二 -- 目录结构

Tor由于经过了长年的开发,版本到现在已经有很多。笔者选用的是tor-0.2.3.25版本。关于版本变迁和更新说明,请大家自行查看:   https://gitweb.torproject.org/tor.git (需翻墙) 1. 源码目录关系图   Tor的源码目录中包括doc, contrib, src等一些列很莫名的文件。其实,在这些所有的文件中,除了src文件夹,其他都可

WInScar的专栏 6306

Tor源码分析三 -- 客户端执行流程(初始化)

Tor系统中,主机的身份包括有这几种:Client,Bridge Server,Relay Server,Directory Server。   当然,有的时候一台主机是可以身兼数个身份,提供不同的服务或获取服务。   我们从最简单的客户端配置的Tor来进行分析,事先了解整个Tor系统的执行规程,之后再具体分析其他身份时候的不同操作,从而加快了解系统的速度。此处要说明的是,由于笔者对Windo

WInScar的专栏 4147

Tor源码分析十一 -- 客户端执行流程(网络信息的下载续)

通过上一节中我们对连接和链路的重新描述,我们可以继续进行源码的分析了。在本节中,我们会开始着重讲述链路的建立,以及链路所基于的OR连接的建立,同时还有部分Libevent调度的再度分析。大家会明白,进行到此处之时,我们已经开始接触Tor系统最底层,最深藏着的连接机制以及调度机制。这个部分,是整个系统的精髓。后期几乎所有的应用请求连接处理等,都是重复地使用该部分的代码。 1. 链路建立以及

WInScar的专栏 3258

Tor源码文件分析 -- Connection

Tor协议的层次结果经过简要分析可以大致概括为如下框图:                 DIR连接……            应用层               ------------------------                 AP连接,EXIT连接……               ------------------                 Cir

WInScar的专栏 2519

Tor源码分析五 -- 客户端执行流程(libevent调度)

上一源码分析的小节中,已经将系统的主要流程启动过程介绍完毕。实际上,系统在如此启动之后,就可以通过正确的流程将Tor系统完整的启动起来,为用户提供应用程序代理服务,以达到匿名通信的目标。本节的目标,不是为了详细介绍系统初始化后的正确启动流程,而是介绍系统是如何通过Libevent的调度实现成功启动的。也就是说,本节的重点在于说明Libevent调度机制在Tor系统之中的应用。   上节当中也简要

WInScar的专栏 3906

Tor源码分析九 -- 客户端执行流程(网络信息的下载)

源码分析到这里,大家应该已经大致了解到Tor系统的前期启动没有做任何的下载操作。前期启动的最关键环节,就是正常开启Libevent的调度机制,从而有条不紊地进行系统内所有子模块的维护等。我们需要再次强调的是,系统的主进程内,是没有做任何直接的获取网络状态,获取路由描述符,获取额外路由信息的操作。系统将这些操作视为需要实时维护的工作,因为所有这些网络信息都有其时限。所以,对这些网络信息的获取,全部置

WInScar的专栏 4410

Tor源码分析四 -- 客户端执行流程(初入主循环)

在上个小节中,已经基本分析了Tor系统的初始化过程。该过程中,最重要的部分,就是对默认配置文件、输入配置文件以及命令行参数进行综合整理,定出最后的配置方案。而后通过配置方案,启动系统的基础部分。这里值得说明的是,Tor系统的所有配置选项,均可以在Tor Manual中找到。并且,根据Tor系统配置成不同的身份,使用的配置选项也会有细微差别。默认的配置固化在代码内部,有兴趣的朋友可以就初始化部分往下

WInScar的专栏 3758

Tor版本号解读

Tor是开源的匿名通信系统,工作需要,近期开始学习Tor相关知识。包括Tor的工作方式,特性,以及其他方面。 Tor源代码维护已久,版本更迭较快,版本号格式如下。 从0.1.0.1-rc开始,版本的格式如下: MAJOR.MINOR.MICRO[.PATCHLEVEL][-STATUS_TAG][ (EXTRA_INFO)]* 括号里的东西是可选的。和前面一样,MAJOR、MINOR、MICRO和PATCHLEVEL都是数字,缺位号等于0。所有的版本都应该完全通过这四个数字来区分。 ST.

lhy_uestc_11的博客 645

Tor源码文件分析 -- Connetion_Edge

所谓的Edge连接主要是形容在链路两端所使用的连接,包括AP连接与EXIT连接两种。Edge连接的存在,主要是为了个应用程序连接提供服务,所以才将两种Edge连接命名为Application Proxy应用代理连接和EXIT出口连接。这两种连接主要出现于链路两端,即链路第一跳与链路最后一跳,分别用于接受应用请求和处理应用请求的发出。因为Edge连接在Tor系统中也具有重要的作用,所以本篇就简单分析

WInScar的专栏 2427

TOR讨论(一)

通过研究资料表明,目前针对TOR的流量分析破坏有如下的方法,Chakravarty研究团队利用在哥伦比亚大学的一台运行着linux系统的Tor中继服务器做了实验测试,他们使用TOR网络获取出口节点与入口节点,分析出口节点与入口节点的网络元数据,比如数据量与数据时延,通过一定时间的数据搜集,计算相关系数,便可得出连接入口节点的主机与连接出口节点的主机之间是否发生通讯关系的结论。转自 《如何攻破匿名网...

LHF_debug的博客 904

Tor源码文件分析 -- Main

Main文件是Tor系统的主要执行函数所处文件,内容偏多,但是较于其他底层处理函数所在的文件,也算较少。所以这里做简要的分析,其中删去很多不常见的,不重要的函数,大家可以自行在源文件内部查看。 1. 全局变量   全局变量在文件头部定义,每个全局变量都已经有比较详尽的英文分析和解释,这里再做简单的罗列。   1)系统(先前)已读与已写字节数以及用于流量控制的令牌桶全局变量;(

WInScar的专栏 2630

Redis主从同步异常问题记录

2015.7.31 10.36.14.*网段的TOR故障一小时,网络故障恢复后,redis nj多个从主从同步异常:

baidu_mtc的博客 4447

渗透测试实战:从信息收集到内网横向移动的完整攻防思维

渗透测试是网络安全领域的核心实践,旨在通过模拟攻击来评估系统安全性。其原理在于主动发现并利用目标系统的技术漏洞与业务逻辑缺陷,从而验证安全防御的有效性。这项技术的价值在于将潜在风险前置暴露,帮助企业在遭受真实攻击前加固防线。在金融、电商、博彩等高价值业务场景中,渗透测试尤为重要。本文以一次模拟实战为例,深入剖析了从外部信息收集、资产测绘,到利用Jenkins未授权访问等薄弱点突破边界,再通过内网代理穿透、凭据复用进行横向移动的完整攻击链。整个过程融合了WAF绕过、蜜罐识别等实战技巧,为理解复杂网络环境下的系

359

Rust 编译工具链配置指南:从 link.exe 缺失到完美解决

本文详细解析了Windows下Rust编译时常见的'link.exe not found'错误,提供了MSVC和MinGW-w64两种工具链的完整配置指南。从Visual Studio组件安装到环境变量设置,再到疑难排查技巧,帮助开发者彻底解决Rust编译工具链配置问题,提升开发效率。

earth的博客 320

保姆级教程:用海思PQTool搞定ISP图像调试,从参数读取到固件烧录全流程

本文提供海思PQTool的ISP图像调试全流程指南,从参数读取、实时调试到固件烧录,涵盖环境配置、核心功能解析、参数固化及生产部署。通过实战案例和避坑指南,帮助开发者高效提升图像质量,适用于海思开发板的ISP调试与优化。

weixin_30872337的博客 282

[学习笔记]Esp32 + 4G模块,随身wifi,ppp拨号上网

Esp32S3 + 4G模块制作随身WIFI教程

weixin_45595548的博客 7419

Arduino平台软硬件原理及使用——Arduino Uno板卡的使用

Arduino Uno板卡的基本使用

洪博hopes的博客 4176

Keil5实战:如何高效导出变量数据并实现可视化分析

本文详细介绍了在Keil5开发环境中,如何利用调试脚本高效导出程序运行时变量数据的方法。通过编写脚本自动捕获数据并保存为文件,再结合Excel或Python进行可视化分析,为嵌入式调试与算法优化提供了数据支撑,显著提升开发效率。

silver的专栏 1106

APB Timer验证环境搭建——学习笔记(1)

以下为个人学习笔记,如有疏漏,请大家指正补充~~APB Timer是一个简单的下行计数器,包括一个32位计数器和一组比较器,可以实现多种计时功能。包括生成一次性中断或者定时中断。

qq_41651535的博客 1579

【单智能体】AI 数据分析智能体案例讲解(附完整源码)

本案例将引导您构建一个基于 AI 的数据分析智能体,让用户能够通过自然语言查询来分析 CSV 和 Excel 文件中的数据,无需掌握 SQL 知识。该智能体使用 Agno Agent 框架集成 OpenAI GPT-4o 模型,并利用 DuckDB 提供高效的数据处理能力。

rengang66的博客 239

多出来的那一截:Java 堆外内存 OOM 的来源分账、分流排查与治理解析

Java进程的RES常比-Xmx多出一截,堆却平稳。本文把堆外内存拆成直接缓冲区、Unsafe、JNI本地库、线程栈、元空间与文件映射六类,用JDK 8与17的六组实验对照RSS、NMT、BufferPool三本账:clear()不释放内存;MaxDirectMemorySize默认约等于堆上限且只管直接缓冲区;禁用显式GC会让申请线程退避半秒后失败;未关闭的Deflater零GC下让RSS涨1GB;Netty池内泄漏GC救不回。最后给出定性、对账、定位的排查路线与预算、编码、监控三层治理。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 14万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: Tor源码分析六 -- 总体框架图
下一篇: Tor源码分析八 -- 客户端执行流程(second_elapsed_callback函数)
WInScar
博客等级 码龄17年 134粉丝 56原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值