.onion 生成 步驟(tor v2 & v3 )

看了一些hidden services 的文獻,大致把.onion的域名生成的步驟畫成下面的圖片,之前有再研究比特幣地址生成的我,發現這樣的生成.onion域名的過程,與比特幣地址生成有相當類似的部分,因為都是式Random生成私鑰,經過私鑰轉公鑰的算法,經過HASH,最後在經過BASE重新編碼,不難發現概念是一樣的。所以誕生出來的比特幣地址或是.onion域名都有它的隨機性。

目錄

v2 .onion地址生成過程

只要有錢有時間就可以爆破出一個美麗的域名或是比特幣地址。

不難發現洋蔥網路所採用的密碼演算法都相當的過氣,如SHA-1、RSA-1024,當然Tor Project 也意識到這樣的問題,在最新版本的v3[2]中,已經闡述了會將SHA-1換成SHA-3,RSA-1024換成橢圓曲線。

Better crypto (replaced SHA1/DH/RSA1024 with SHA3/ed25519/curve25519)

原文

 .onion

  SYNTAX:  [digest].onion
           [ignored].[digest].onion

  The digest is the first eighty bits of a SHA1 hash of the identity key for
  a hidden service, encoded in base32.

  When Tor sees an address in this format, it tries to look up and connect to
  the specified hidden service.  See rend-spec.txt for full details.

  The "ignored" portion of the address is intended for use in vhosting, and
  is supported in Tor 0.2.4.10-alpha and later.

著名的 .onion 域名網站

Facebook

他們使用超過500,000個核心,耗資 US$100,000,耗時一周來反復生成.onion域名,產物” facebookcorewwwi.onion”。

BlockChain.info

花費了200–300美元,大約24小時使用AWS G1實例和六個ATI 來創建自己的.onion域名,產物”blockchainbdgpzk.onion”。

ExpressVPN

一般的電腦耗時兩周,產物”expressobutiolem.onion”。

[1]https://www.expressvpn.com/blog/how-to-create-a-onion-address/

[2]https://blog.torproject.org/tor-0329-released-we-have-new-stable-series

v3 .onion地址生成過程

在v3的地址生成中已經放棄了sha-1也沒有放上新的sha-3

256 bits 的 ECC key 強度大約是 3072 bits RSA key (以現在最好的攻擊演算法來估算)。 直接放 public key 不需要經過 hash function 計算,可以避免掉 hash function 被找到 collision 時的風險。[3]

採用了新的公私鑰轉換演算法ed25519[1],舊有的RSA已經不再是推薦安全的演算法。

ed25519 算法相對於secp256k1 更加高效,同時安全性也非常高。目前也被廣泛應用很多加密數字貨幣項目中,著名的項目例如Zcash、公證通(Factom)、新經幣(NEM)等等, 以太坊的創始人Vitalik 也曾在博客中公開表示,以太坊計劃在新版本中切換到ed25519。ed25519 的好處是在不損失安全級別的情況下,顯著提昇運算效率,其效率是secp256k1 的很多倍。以ed25519 的論文中的實驗為例,該算法完成一次簽名需要87548 個CPU 循環,一個4 核2.4GHz 的CPU 每秒可以完成109000 次簽名。密鑰的生成也非常高效。而ed25519 的安全級別和secp256k1 的級別相同,都是128 位的安全級別。[2]

新的v3比較特別的是他加入了CHECKSUM,這個CHECKSUM與比特幣地址生成中的CHECKSUM不同,比特幣的版本是取double sha-256取前幾個bit當作CHECKSUM,而.onion v3 採用的是簽章算法中的CHECKSUM。

最後一個步驟是把Public Key 、CHECKSUM、版本號放在一起做base32編碼,產物為56個字。

原文

1. Encoding onion addresses [ONIONADDRESS]

   The onion address of a hidden service includes its identity public key, a
   version field and a basic checksum. All this information is then base32
   encoded as shown below:

     onion_address = base32(PUBKEY | CHECKSUM | VERSION) + ".onion"
     CHECKSUM = H(".onion checksum" | PUBKEY | VERSION)[:2]

     where:
       - PUBKEY is the 32 bytes ed25519 master pubkey of the hidden service.
       - VERSION is an one byte version field (default value '\x03')
       - ".onion checksum" is a constant string
       - CHECKSUM is truncated to two bytes before inserting it in onion_address

[1]https://ed25519.cr.yp.to/

[2]https://zhuanlan.zhihu.com/p/28764295

[3]https://blog.gslin.org/archives/2017/11/03/7725/%E4%B8%8B%E4%B8%80%E4%BB%A3%E7%9A%84-tor-hidden-service/

[4]https://gitweb.torproject.org/torspec.git/plain/proposals/224-rend-spec-ng.txt

Written on January 24, 2018