匿名网络Tor中的协议与规范

本文对匿名网络TOR中相关协议与规范进行了总结

● Tor基础协议,规定Tor系统的整体构架,以及实体之间通信的具体准则;

● Tor目录协议,规定Tor系统中目录服务器的工作规则及相关细节;

● Tor匿名服务协议,规定Tor系统中匿名服务的执行流程及相关细节;

● Tor控制协议,规定应用程序如何控制Tor程序的执行;

● Tor版本号规范,阐明Tor指定版本号的基本原则;

● Tor地址规范,阐明Tor接受的浏览器输入地址的种类;

● Tor路径选择规范等,阐明Tor运行时如何选择建立链路的结点。

协议的相关密钥

Tor系统使用到的密码学加密算法:

● 对称密码加密算法:CTR 模式下的 128-bit AES 算法,IV 初始值为 0;

● 公钥密码加密算法:固定指数为 65537 的 1024-bit RSA 算法,所使用的填充机制为 OAEP-MGF1,摘要算法为 SHA-1;

● 密钥交换协议:Diffie-Hellman 密钥交换协议,使用固定的生成元 2,固定的模数 (rfc2409-6.2 节);

● 哈希算法:SHA-1。

Tor所使用到的全部密钥:

  1. TLS连接密钥对(对称密钥)
  2. OR(Onion router)临时密钥对(对称密钥):OP(Onion proxy)与OR建立链路时通过DH协议协商生成的密钥对,是洋葱路由思想的基础。

$K1(K2(K3(M)))$

  1. OR洋葱密钥(非对称公私钥对):RSA算法生成,公钥发布到目录服务器。在OP与OR使用DH协议协商临时密钥时使用。
  2. OR ID密钥(非对称公私钥对):RSA算法生成,私钥用于OR生成各类描述符的签名,公钥公开用于认证OR的签名。OR ID 密钥的公钥的摘要被作为 OR 的 fingerprint 用以标识特定 OR。
  3. 目录服务器签名密钥(非对称公私钥对):RSA算法生成,私钥用于目录服务器签发各种目录文件,公钥公开用于验证目录文件的签名。
  4. 目录服务器ID密钥(非对称公私钥对):RSA生成,私钥用于签发目录服务器证书,公钥用于验证证书;目录服务器 ID 密钥的公钥的摘要被作为目录服务器的 fingerprint 用以标识特定目录服务器。

Tor连接的建立细节

Tor连接的建立第三个版本的建立协议称为:in-protocol

在该协议中,TLS握手协议完成后运行Tor握手协议。

TLS握手协议所使用的连接证书必须至少满足下列要求中的一项

  • 证书是自签名的;
  • 证书的公钥密码模数的长度大于 1024 bits;
  • 发行者或目标者的 commonName 不以“.net”结尾;

Tor握手协议具体文档:https://gitweb.torproject.org/torspec.git/tree/tor-spec.txt

数据包CELL的格式

两种基本数据单元:定长CELL,不定长CELL

定长CELL的格式
定长CELL的格式

​ 定长CELL的固定长度为512字节,其中链路ID域占2字节,数据指令域占1字节,负载占509字节,定长CELL主要用于链路相关操作,如建立、维护、数据传输、断开等操作

Command域有如下值:

 0 -- PADDING     (Padding)                 (See Sec 7.2)
 1 -- CREATE      (Create a circuit)        (See Sec 5.1)
 2 -- CREATED     (Acknowledge create)      (See Sec 5.1)
 3 -- RELAY       (End-to-end data)         (See Sec 5.5 and 6)
 4 -- DESTROY     (Stop using a circuit)    (See Sec 5.4)
 5 -- CREATE_FAST (Create a circuit, no PK) (See Sec 5.1)
 6 -- CREATED_FAST (Circuit created, no PK) (See Sec 5.1)
 8 -- NETINFO     (Time and address info)   (See Sec 4.5)
 9 -- RELAY_EARLY (End-to-end data; limited)(See Sec 5.6)
 10 -- CREATE2    (Extended CREATE cell)    (See Sec 5.1)
 11 -- CREATED2   (Extended CREATED cell)    (See Sec 5.1)
 12 -- PADDING_NEGOTIATE   (Padding negotiation)    (See Sec 7.2)

不定长CELL的格式
不定长CELL的格式

​ 不定长CELL有一个长度域为2字节,负载的长度由长度域进行控制,该CELL主要用于Tor握手协议过程的数据包运输

不定长CELL的Command数据值:

7 -- VERSIONS    (Negotiate proto version) (See Sec 4)
128 -- VPADDING  (Variable-length padding) (See Sec 7.2)
129 -- CERTS     (Certificates)            (See Sec 4.2)
130 -- AUTH_CHALLENGE (Challenge value)    (See Sec 4.3)
131 -- AUTHENTICATE (Client authentication)(See Sec 4.5)
132 -- AUTHORIZE (Client authorization)    (Not yet used)

CircID的长度(CIRCID_LEN)在version 1, 2 and 3为2,在version 4中为4

定长CELL还可以根据CMD的不同分为控制数据包转发数据包

PADDING CELL 用于保持当前连接处于active状态,如果没有其他流量,则OR与OP每隔几分钟发送一次PADDING CELL;

CREATE, CREATE2, CREATED, CREATED2, 和 DESTROY CELL;

RELAY CELL用于在链路中转发数据包,包含有额外的头部;(关键理解下这个)

VERSIONS 和 NETINFO 两个CELL用于在v2协议里设置链路的连接,在v3以及更高的协议版本里,CERTS, AUTH_CHALLENGE, and AUTHENTICATE 这三个CELL包也可能用到。

链路与流建立的相关细节

链路,类似于传统意义上的虚电路,是一条完整的数据通道。 该数据通道可以由一个 OP 及数个 OR 组成

流,即通信数据流,是 TCP 数据流的直接表现

系统为每个 TCP 数据流建立一个链路。因为链路的建立极为耗时,所以在 Tor 系统的一条链路中,多条 TCP 通信数据流被复合在一起。而在 Tor 系统的一个连接中,多条链路也可以被复合在一起。这样的情形,类似于“多路复用”技术。

链路的建立

TOR链路的建立过程
TOR链路的建立过程

Alice是通信的发起者,希望通过Tor网络匿名地浏览Web内容。Alice的洋葱代理OP首先选择Tor中的路由转发节点并与之协商相应的会话秘钥,从而建立一条通向Web的链路。步骤如下:

  1. Alice通过OP先发送一个Create命令的数据包给它选定的洋葱路由节点OR1(以下称为Bob

    c1:Alice与Bob之间的CircID
    E(g^x1):代表用Bob的洋葱密钥公钥加密的DH握手协议的第一部分内容
  2. Bob返回一个对应的Created数据包

    c1: Alice to Bob CircID
    g^y1: DH握手协议第二部分内容明文
    H(K1):Bob用握手协议生成对话密钥K1 并用Hash函数生成Hash值(让双方可以通过哈希对话密钥的方式验证各自生成的会话秘钥是否一致!)
  3. 链路建立后,Alice和Bob之间可以发送转发数据包(Relay CELL),该CELL的负载部分(509B)用Alice和Bob的会话密钥K1进行加密
  4. 为了扩展链路,Alice发送一个用K1加密后的转发数据包(Relay Extend)给Bob。

    c1: Alice to Bob CircID
    Extend:Relay的CMD
    OR2:下一跳需要扩展的路由器
    E(g^x2):利用OR2的洋葱路由公钥加密的DH握手协议的第一部分内容
  5. Bob正确接收到扩展命令后,构建一个Create数据包!

    c2:Bob与OR2(Carol)的链路CircID
    E(g^x2):从Alice处接收到的消息内容,同上解释
  6. OR2(以下称为Carol)不知道Alice的存在。Carol返回一个Created数据包给Bob

    c2:Bob to Carol CircID
    g^y2:其实是与Alice的握手协议的第二部分 明文
    H(K2):用g^x2与g^y2生成的临时会话秘钥K2,并用哈希加密
  7. 当Bob收到Carol的消息后,Bob用K1加密一个Relay Extended数据包,然后发还给Alice,这样链路就拓展到了Carol。且Alice也可以通过参数g^x2和g^y2生成会话秘钥K2,并且哈希后与H(K2)相比较是否一致。
  8. Alice向Carol发送转发数据包时,对转发数据包负载的加密如下:

$K1(K2(Payload))$

  1. 链路可以逐步扩展,直到与目的Web建立链接。

整个过程用到RSAAES两种加密手段

流的建立

​ 当链路的发起者完成一条安全链路的建立,并期望其上层Application与某个给定地址的主机所对应的服务端口建立一条TCP连接时,它可以通过SOCKS请求OP为其建立TCP连接。本地洋葱代理 OP 选择最新创建的符合要求的链路(或者再创建一个新的链路,并选择一个合适的洋葱路由器 OR 作为出口节点(通常为最后一个节点))

​ 当成功选择到可用链路后,洋葱代理 OP 创建一个随机的流 ID,然后将该流 ID 作为参数发送一个Relay-Begin数据包给出口节点。一旦出口节点连接到远端主机,它返回一个Relay-Connected数据包。接收到这条消息后,本地洋葱代理 OP 会发送一个 SOCKS 答复通知应用程序连接建立成功。而后,本地洋葱代理 OP 开始接收本地应用程序的 TCP 数据流,对其进行分片,然后层层加密,最后将其打包成为固定长度的Relay-Data数据包,并在建立好的链路中发送这些数据包并获得响应。

附:Relay CELL的payload部分构成

    The payload of each unencrypted RELAY cell consists of:
         Relay command           [1 byte]
         'Recognized'            [2 bytes]
         StreamID                [2 bytes]
         Digest                  [4 bytes]
         Length                  [2 bytes]
         Data                    [PAYLOAD_LEN-11 bytes]

   The relay commands are:
         1 -- RELAY_BEGIN     [forward]
         2 -- RELAY_DATA      [forward or backward]
         3 -- RELAY_END       [forward or backward]
         4 -- RELAY_CONNECTED [backward]
         5 -- RELAY_SENDME    [forward or backward] [sometimes control]
         6 -- RELAY_EXTEND    [forward]             [control]
         7 -- RELAY_EXTENDED  [backward]            [control]
         8 -- RELAY_TRUNCATE  [forward]             [control]
         9 -- RELAY_TRUNCATED [backward]            [control]
        10 -- RELAY_DROP      [forward or backward] [control]
        11 -- RELAY_RESOLVE   [forward]
        12 -- RELAY_RESOLVED  [backward]
        13 -- RELAY_BEGIN_DIR [forward]
        14 -- RELAY_EXTEND2   [forward]             [control]
        15 -- RELAY_EXTENDED2 [backward]            [control]

链路与流的区别:

链路在 TLS 连接之中的复用是通过链路 ID 实现的。类似的,TCP 数据流在链路之中的复用是通过流 ID 实现的。

Tor中的链路(Circuit)更像是协议协商一致后构成的一个虚电路,处于应用层,需要TCP协议的支持,TCP是网络层上的协议。

Tor匿名服务协议实现过程

Tor可以为系统用户提供Hidden Service服务。

Tor利用Hidden Service协议中提供的"约会节点"来为除服务提供者之外的其他Tor用户访问被隐藏的服务,而被服务的Tor用户对服务提供者的除提供服务以外的信息一无所知。

(1) 提供服务的Tor用户随机选取Tor网络中的几个中继结点,建立链路,并通过告知这些结点该提供服务的用户的服务公钥的方式来请求结点作为其介绍结点(Introduction Point)。如下图,提供服务的Bob选择建立了IP1、IP2、IP3三条链路,并请求他们成为匿名服务的介绍结点。

Hidden Services: 1
Hidden Services: 1

(2) Bob为其特定的匿名服务生成一个匿名服务描述符,该描述符之中包括服务对应的公钥,服务介绍结点列表,以及利用服务私钥对该描述符前述部分的签名。匿名服务描述符被上传到分布式哈希表(DHT)以供其他Tor用户查找,如下图,Bob发布的匿名服务描述符的查找索引为"XYZ.onion",其中XYZ为由匿名服务公钥生成而来的服务名,包括16个英文字母。

Hidden Services: 2
Hidden Services: 2

(3) 当一个Tor用户想要请求匿名服务时,需要先利用某些途径得到该匿名服务对应的洋葱地址,即前述的"XYZ.onion"。得到洋葱地址之后,该用户通过询问DHT得到匿名服务描述符,若该描述符存在,则通过描述符得知匿名服务的介绍结点列表和所使用的公钥信息。在此期间,Tor用户建立一条链路到一个随机挑选的中继结点,并通过告知该结点一个一次性秘密信息来请求其作为该用户的约会结点(rendezvoud point)

Hidden Services: 3
Hidden Services: 3

(4) 当匿名服务描述符下载完毕、约会结点也成功设置后,请求匿名服务的Tor用户(上图中的Alice)构造一个由匿名服务公钥加密的消息该消息的内容为约会结点的地址,以及预先协商完成的一次性秘密信息,该消息通过链路发送至匿名服务的某一个介绍结点,而收到消息的介绍结点则会转发消息给匿名服务提供者(Bob)。

Hidden Services: 4
Hidden Services: 4

(5) Bob获取到匿名服务用户Alice发送来的加密的服务相关消息后,用自己的私钥进行解密,并获得其中的约会结点地址及One-time secret。而后Bob建立一条链路到约会结点,并向其发送接收到的One-time secret。

Hidden Services: 5
Hidden Services: 5

(6) 约会结点将已连接到Bob的消息告知Alice,在Alice接收到消息之后,其便可以通过约会结点建立起来的链路进行类似常规Tor网络通信的正常通信。在整个Hidden Service协议的运行过程中,协议中选用的IP1、IP2、IP3以及RP均无法确切得知通信双方的身份及地理位置。但是结点RP作为通信双方的中间结点,如果身份泄露很可能受到流量分析等攻击手段。

Hidden Services: 6
Hidden Services: 6

添加新评论

已有 1 条评论

(╯°A°)╯︵○○○