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                                                                Length = 498B

      Relay CMD  ::=  data  |  extend  |  extended  | 

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值