📅 更新: 這篇 2018 年 1 月的文章涵蓋了 Tor v2 和 v3 位址生成。請注意,Tor v2 位址現已棄用。現代 Tor hidden services 專門使用採用 ed25519/curve25519 加密技術的 v3 位址。

在研究 hidden services 時,我繪製了生成 .onion 網域的過程圖。有趣的是,這個過程與 Bitcoin 位址生成有相似之處:兩者都從隨機私鑰開始,然後轉換為公鑰,進行雜湊處理,最後使用 BASE 編碼重新編碼。這種方法確保了 Bitcoin 位址和 .onion 網域的隨機性和唯一性。

Tor v2 與 v3 位址生成比較

graph TD
    subgraph "Tor v2 (Deprecated)"
        A1[Random Private Key] -->|RSA-1024| B1[Public Key<br/>1024-bit]
        B1 -->|SHA-1 Hash| C1[Hash Result<br/>160-bit]
        C1 -->|Take First 80 bits| D1[Base32 Encode]
        D1 --> E1[16-character<br/>.onion Address]
    end

    subgraph "Tor v3 (Current)"
        A2[Random Seed<br/>256-bit] -->|ed25519| B2[Public Key<br/>32 bytes]
        B2 --> C2[Public Key +<br/>Checksum + Version]
        C2 -->|SHA3-256| D2[Generate Checksum]
        D2 -->|Base32 Encode| E2[56-character<br/>.onion Address]
    end

    style A1 fill:#FF5722
    style E1 fill:#FF5722
    style A2 fill:#4CAF50
    style E2 fill:#4CAF50

主要差異

特性 Tor v2(已棄用) Tor v3(現行)
加密技術 RSA-1024(不安全) ed25519(安全)
雜湊函數 SHA-1(已被破解) SHA3-256(現代)
位址長度 16 字元 56 字元
安全等級 ~80-bit ~128-bit
位址空間 2⁸⁰(~1.2×10²⁴) 2²⁵⁶(巨大)
狀態 已棄用(2021) 使用中

v2 .onion 位址生成過程

只要有足夠的資源和時間,就可以生成視覺上美觀的網域名稱或 Bitcoin 位址。

Tor v2 .onion address generation diagram showing private key to public key using RSA-1024 and SHA-1 hashing

很明顯,onion 網路中使用的加密演算法,如 SHA-1 和 RSA-1024,已經有些過時。認識到這一點,Tor Project 在最新的 v3 協議中引入了改進1,用 SHA-3 取代 SHA-1,用橢圓曲線加密取代 RSA-1024。

「更好的加密(用 SHA3/ed25519/curve25519 取代了 SHA1/DH/RSA1024)」

知名的 .onion 網域網站

  • Facebook: 使用超過 500,000 個核心,花費約一週時間和約 100,000 美元來生成網域「facebookcorewwwi.onion」。
  • BlockChain.info: 使用 AWS G1 實例和六個 ATI 顯卡,花費約 200-300 美元和約 24 小時來建立「blockchainbdgpzk.onion」。
  • ExpressVPN: 一台普通電腦花了大約兩週時間生成「expressobutiolem.onion」2

v3 .onion 位址生成過程

v3 位址生成已經放棄了 SHA-1,並採用了新的 SHA-3。

「256-bit ECC 金鑰大約相當於 3072-bit RSA 金鑰(基於目前最佳的攻擊演算法)。」

Tor v3 .onion address generation using ed25519 and SHA3-256 with checksum producing 56-character addresses

v3 協議引入了 ed25519 演算法2用於公私鑰轉換,取代了安全性較低的 RSA 演算法。Ed25519 以其效率和高安全性而聞名,目前被許多加密項目使用,如 Zcash、Factom、NEM,以及計劃在 Ethereum 中實施。Ed25519 在不損害安全性的情況下提供了顯著的計算效率改進,相當於 128-bit 安全等級,與 secp256k1 類似。

v3 的一個獨特之處是添加了 CHECKSUM,這與 Bitcoin 位址生成中使用的 CHECKSUM 不同。Bitcoin 使用雙重 sha-256 並取前幾位作為 CHECKSUM,而 .onion v3 使用簽名演算法作為其 CHECKSUM。

最後一步是將 Public Key、CHECKSUM 和版本號組合起來,用 base32 編碼,生成 56 字元長的 .onion 位址。

v3 位址生成的原始文檔

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 a 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