生成 .onion 位址:逐步指南(Tor v2 & v3)
📅 更新: 這篇 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 位址。

很明顯,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 金鑰(基於目前最佳的攻擊演算法)。」

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