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)))$

  3. OR 洋葱密钥(非对称公私钥对):RSA 算法生成,公钥发布到目录服务器。在 OP 与 OR 使用 DH 协议协商临时密钥时使用。

  4. OR ID 密钥(非对称公私钥对):RSA 算法生成,私钥用于 OR 生成各类描述符的签名,公钥公开用于认证 OR 的签名。OR ID 密钥的公钥的摘要被作为 OR 的 fingerprint 用以标识特定 OR。

  5. 目录服务器签名密钥(非对称公私钥对):RSA 算法生成,私钥用于目录服务器签发各种目录文件,公钥公开用于验证目录文件的签名。

  6. 目录服务器 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 的固定长度为 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 有一个长度域为 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链路的建立过程

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))$

  9. 链路可以逐步扩展,直到与目的 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 是网络层上的协议。


文章作者: 玄霄
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 玄霄 !
评论
  目录