洋葱路由

洋蔥路由（）為一種在電腦網路上匿名溝通的技術。在洋蔥路由的網路中，訊息一層一層的加密包裝成像洋蔥一樣的封包，並經由一系列被稱作洋蔥路由器的網路節點傳送，每經過一個洋蔥路由器會將封包的最外層解密，直至目的地時將最後一層解密，目的地因而能獲得原始訊息。而因為透過這一系列的加密包裝，每一個網路節點（包含目的地）都只能知道上一個節點的位置，但無法知道整個傳送路徑以及原傳送者的位址。

 發明與實作 
1990年代中期，美國海軍研究實驗室的研究員保羅·西弗森、和大衛‧戈爾德施拉格（）為了保護美國線上情報系統而開發了洋蔥路由。其後國防高等研究計劃署接手該計畫繼續開發，並在1998年獲得海軍的專利。2002年電腦科學家羅傑·丁格爾定和尼克·馬修森加入了西維爾森的計畫，並開始開發Tor；Tor為「洋蔥路由專案」（）的頭字語，該專案後來成為規模最大的洋蔥路由實作並廣為人知。之後美國海軍研究實驗室將Tor以自由軟體授權的方式公開了原始碼，丁高戴恩、馬修森以及其他五位成員在2006年成立了名為「」的非營利組織，並獲得包含電子前哨基金會在內的幾個組織的。

 資料結構 

被稱作洋蔥路由的原因在於訊息一層一層的加密包裝成被稱作洋蔥封包的資料結構，層數取決於到目的地中間會經過的節點數，每經過一個節點層會將封包的最外層解密，因此任一個節點都無法同時知曉這個訊息最初與最終的目的地，使發送者達到匿名的效果。

 封包的建立與傳送 
為了傳送洋蔥封包，發送訊息者會從「目錄節點」（）提供的列表中選取一些節點，並以這些規劃出一條被稱作「鏈」（）或「線路」（）的傳送路徑，這條路徑將為傳輸封包所用。為了確保發送者的匿名性，任一節點都無法知道在鏈中自己的前一個節點是發送者還是鏈上的另一節點；同理，任一節點也無法知道在鏈中自己的下一節點是目的地還是鏈上另一節點。只有鏈上的最後一個節點知道自己是鏈上最終節點，該節點被稱作「出口節點」（）。

洋蔥路由網路使用非對稱加密，發送者從目錄節點獲得一把公開金鑰，用之將要傳送的訊息加密並傳送給鏈上的第一個節點，該節點又被稱作入口節點（）；其後與之建立連線和共享密鑰。建立連線後發送者就可以通過這條連線傳送加密過的訊息至鏈上的第二個節點，該訊息將只有第二個節點可以解密；當第二個節點收到此訊息後，便會與前一個節點也就是入口節點同樣的建立連線，使發送者的加密連線延伸到它，但第二個節點並不曉得前一個節點在鏈中的身份。之後按照同樣原理，發送者通過入口節點和第二個節點的這條加密連線將只有第三個節點能解密的訊息傳送給第三個節點，第三節點同樣的與第二個節點建立連線；藉由重複相同的步驟，發送者能產生一條越來越長的連線，但在效能上仍有限制。

當鏈上的連線都建立後，發送者就可以透過其傳送資料並保持匿名性。當目的地回送資料時，鏈上的節點會透過同一條連線將資料回傳，且一樣對資料層層加密，但加密的順序與發送者完全相反；原發送者收到目的地回傳的資料時，將僅剩最內一層加密，此時對其解密就可拿到目的地回送的訊息。

 弱點 
 計時分析 

傳統網際網路不被認為具有匿名性的一個理由為網際網路服務供應商具有紀錄和追蹤各電腦間的連線能力；例如當有人存取一個特定網站時，往來的資訊內容如密碼等，雖然能透過像是HTTPS等加密連線方式保護讓其他人無法得知內容，但是連線本身卻仍會有紀錄，包含何時建立連線，多少資料量被傳送等。洋蔥路由雖然能建立並隱藏兩電腦之間的連線，使兩者之間並無一個可分辨的直接連線，但仍會有上述的連線紀錄問題。可藉由搜尋連線紀錄的連線時間和資料傳輸量來試圖判別潛在的一對發送者與接收者；例如當有人傳送51KB的資料到一個未知的電腦，三秒後另一未知的電腦傳送51KB的資料給一個特定的網站，則可以推斷此人可能與該網站曾建立連線。此外還有一些原因可以讓流量分析更加有效，包含節點的損壞或離開網路，以及當鏈已經因為定期重建而改變，但有些鏈上節點卻仍在追蹤此前建立的會話等。

大蒜路由是洋蔥路由的一種變體，其結合了I2P網路並將多份訊息加密打包在一起，使其更難被攻擊者以流量分析的方式破解。

 出口節點漏洞 
雖然訊息在洋蔥路由網路中被層層加密，但是在出口節點時，該節點會把最後一層解密並將原始訊息傳給接收者；因此若出口節點遭到攻擊或是受控制，則原始的訊息將會被截取。瑞典研究員丹‧伊格史塔德（）曾用此方式獲得了超過100封寄給外國大使館的電子郵件密碼。出口節點漏洞的原理與未加密無線網路很類似，後者為使用者將未加密的資料在無線網路上傳送時可能中途被其他人截走；這兩種問題都可以透過端對端加密連線如SSL、HTTPS等方式解決。

 相關條目 

密碼學
迪菲－赫尔曼密钥交换
Java Anon Proxy
俄羅斯娃娃
代理伺服器
暗網

 參考資料 

 外部連結 
Onion-Router.net 

Category:网络隐私
Category:路由
Category:网络协议