隱私加密系列|詳解分散式雜湊表DHT

買賣虛擬貨幣
介 紹雜湊表是將鍵對映到值的資料結構。雜湊函式用於計算插入表中的鍵,以後可以從中檢索值。顧名思義,分散式雜湊表(DHT)是分佈在許多連結節點之間的雜湊表,這些節點協作以形成單個內聚雜湊表服務。節點連線在一個稱為覆蓋網路的網路中。覆蓋網路只是建立在另一個網路之上的通訊網路。網際網路就是一個例子,它始於公共交換電話網路上的覆蓋網路。⟨key,value⟩對通常儲存在網路的一個子集中,通常以某種“接近”的方式儲存。

DHT網路設計允許網路容忍出現故障的節點而不會出現故障,並允許網路規模無限增加。

dht的需求源於早期的檔案共享網路,如Gnutella、Napster、FreeNet和BitTorrent,它們能夠利用網際網路上的分散式資源提供單一的內聚服務。

這些系統採用了不同的方法來在網路上定位資源:

· Gnutella搜尋效率低下,因為查詢將導致資訊氾濫到網路中。
· Napster使用了中央索引伺服器,這是一個單點故障,很容易受到攻擊。
· FreeNet使用了基於金鑰的路由。但是它的結構比DHT少並且不能保證可以找到資料。

2001年,引入了四個DHT專案:CAN,Chord,Pastry和Tapestry。他們的目標是具有類似於集中索引的查詢效率(O(log(n))),同時具有分散網路的優勢。

DHT根據給定演算法使用各種技術來實現這一目標。但是它們有許多共同點:

· 每個參與者都有一些唯一的網路識別符號。
· 他們執行對端查詢,資料儲存和檢索服務。
· 有一些隱式或顯式的連線過程。
· 通訊僅需要透過某種演算法確定的鄰居之間發生。

在本文中,我們將討論所有DHT共有的一些方面,並深入研究一個流行的DHT實現,稱為Kademlia。

DHT網路的特徵

對等發現(Peer Discovery)

對等發現是在分散式網路中定位節點進行資料通訊的過程。這是由每個節點維護一個對等點列表並與網路上的其他節點共享該列表而實現的。一個新的參與者將首先聯絡一組預定義的引導節點來尋找他們在網路上的對等點。這些節點是正常的網路參與者,恰好是某些動態或靜態列表的一部分。它是網路上每個節點的工作,以便於對等點的發現。

隨著對等方不斷相互交流,這些列表會不斷更新以確保網路完整性。

可擴充套件性和容錯性

DHT網路有效地分配了對路由資訊和資料的複製儲存和檢索的責任。這種分佈允許節點以最小或沒有中斷的方式加入和離開。網路可以具有大量的節點(在BitTorrent的情況下為數百萬個節點),而每個節點不必知道網路中的每個其他參與者。這樣,與典型的集中式系統相比,DHT本質上具有更強的抵禦惡意攻擊者的能力。

BitTorrent是現存最大的分散式網路之一,其包含的併發使用者數千萬,活動使用者數億。據估計BitTorrent網路每月有25億使用者。截至2019年,Tor擁有約9000臺中繼伺服器和200多萬使用者。

分散式資料儲存

節點的子集可以儲存和複製任意資料,以供以後檢索。使用一致的雜湊函式(例如SHA256)對資料進行雜湊處理以生成資料的金鑰。該資料被傳播並最終儲存在一個節點ID與某個距離函式的該資料的金鑰“更近”的一個或多個節點上。

分割槽資料儲存對典型的區塊鏈的作用有限,因為需要每個完整節點保留所有交易和塊的副本以進行驗證。

Kademlia

Kademlia被設計為在分散式對等(P2P)網路中儲存和查詢內容的有效手段。它具有許多其他DHT無法同時提供的核心功能,例如:

1. 節點相互瞭解所需的訊息數量最小化。
2. 節點有足夠的資訊透過低延遲路徑路由流量。
3. 並行和非同步查詢是為了避免失敗節點的超時延遲。
4. 節點存在演算法抵抗某些基本的分散式拒絕服務(DDoS)攻擊。

節點ID

節點選擇一個n位ID,該ID將提供給網路上的其他節點。網路設計依賴於透過一些隨機過程均勻分佈的節點ID。節點的位置由其ID的最短唯一字首確定,該字首形成一個樹結構,節點ID為葉子。當節點重新加入網路時,應重新使用此ID。下圖顯示了三位金鑰空間中的二進位制樹結構:

節點ID的位長應足夠大,以使在使用均勻分佈的隨機數生成器時極不可能發生衝突。

引導節點(Bootstrapping a Node)

希望加入網路的節點沒有已知的聯絡人。為了使節點在網路上建立自己節點,它必須聯絡一個或多個引導節點。這些節點在任何方面都不是特殊的,只是列在一些預定義的列表中。它們只是作為請求節點的第一個聯絡點,以便讓更多的網路知道並找到其最接近的對等點。

有很多方法可以獲得引導節點,包括向配置新增地址和使用DNS種子。連線過程描述如下:

1. 連線節點生成一個隨機ID。
2. 它會聯絡一些它知道的節點。
3. 它傳送新生成的節點ID的FIND_NODE查詢請求。
4. 聯絡的節點返回他們所知道的最近的節點。新發現的節點將新增到加入節點的路由表中。
5. 然後連線節點聯絡它所知道的一些新節點。然後該過程迭代地繼續,直到連線節點無法找到任何更靠近的節點。

這種自查詢有兩個效果:它允許節點了解更靠近自己的節點;它用節點的ID填充其他節點的路由表。

XOR Metric

2002年發表的Kademlia論文提供了使用XOR(⊕)運算子確定距離以及網路中對等節點的位置的新穎思想。定義為:

之所以可行,是因為XOR具有與任何距離函式相同的數學屬性。

具體來說,

Identity: a⊕a=0
Non-negativity: a⊕b>0 for a≠b
Symmetry: a⊕b=b⊕a
Triangle inequality: a⊕b+b⊕c≥a⊕c

XOR度量隱式捕獲了先前樹結構中的距離概念。

協議

Kademlia是一個相對簡單的協議,它只包含四個遠端過程呼叫(RPC)訊息,這有助於兩個獨立的關注點:對等發現和資料儲存/檢索。

以下RPC訊息是Kademlia協議的一部分:

對等發現(Peer discovery)

· PING/PONG-用於確定同伴的活動狀態。
· FIND_NODE-返回更接近給定查詢值的多個節點。

資料儲存/檢索

· STORE-請求儲存 ⟨key,value⟩對。
· FIND_VALUE-透過返回更近的節點,其行為與FIND_NODE相同。如果節點具有請求的⟨key,value⟩對,則它將返回儲存的值。

值得注意的是,沒有JOIN訊息。這是因為在Kademlia中沒有明確的加入。每當在它們之間傳送/接收RPC訊息時,每個對等體都有機會被新增到另一個節點的路由表中。以這種方式,該節點成為網路已知的。

查詢程式(Lookup Procedure)

給定節點ID,查詢過程允許節點定位其他節點。該過程從啟動器同時查詢與其知道的目標節點ID最接近的α(併發引數)節點開始。查詢的節點返回它知道的k個最近的節點,然後查詢節點輪流進行,查詢越來越近的節點,直到找到該節點為止。在此過程中,查詢節點和中間節點都相互瞭解。

資料儲存和檢索程式

儲存和檢索過程確保 ⟨key,value⟩對被可靠地儲存並且能夠被網路中的參與者檢索:

· 儲存過程使用查詢過程來定位最接近鍵的節點,這時它將向這些節點發出STORE RPC訊息。每個節點都會重新發布⟨key,value⟩對,以提高資料的可用性。取決於實現方式,資料最終可能會過期(例如24小時)。因此在該期限到期之前,可能要求原始釋出者重新發布資料。

· 檢索過程遵循與儲存相同的邏輯,除了發出FIND_VALUE RPC和接收資料外。

路由表

每個節點將聯絡人組織到一個名為路由表的列表中。路由表是一個二叉樹,其中葉子是“bucket”,最多包含k個節點。k是一個網路範圍的引數,應該足夠大,以確保查詢和資料以高概率可用。這些bucket被恰當地命名為k-bucket,並且包含一些具有公共節點ID字首的節點。

應當注意,這是由XOR度量捕獲的。例如給定節點A(1100)具有對等端B(1110),C(1101),D(0111)和E(0101),到節點A的距離為:

A⊕B=0010(2)
A⊕C=0001(1)
A⊕D=1011(11)
A⊕E=1001(9)

A,B和C共享相同的字首,直到前兩個最高有效位(MSB)。但是A,C和D不共享字首位,因此相距較遠。在這個例子中,A、B和C在同一個bucket中,D和E在它們自己的bucket中。

最初一個節點的路由表不填充k-bucket,但是可以在一個k-bucket中包含一個節點。隨著更多節點的出現,它們會被新增到k-bucket中,直到k-bucket滿為止。此時,節點將bucket分成兩部分:一部分用於與自身共享相同字首的節點,另一部分用於所有其他節點。

這保證了對於bucket j,其中0<=j<k,節點A的路由表中至少有一個節點N

k-bucket排序

k-bucket中的對等點按最少到最近看到的排序。一旦節點接收到來自對等方的請求或回覆,它就會檢查對等方是否包含在適當的k-bucket中。根據對等點是否已存在,該條目將被移動或附加到列表的尾部(最近看到的)。如果一個特定的bucket已經是大小k,那麼節點將嘗試PING列表中的第一個對等方(最近看到的最少)。如果對等方不響應,則將其逐出並將新對等方附加到儲存bucket中,否則將丟棄新對等方。透過這種方式,演算法偏向於使用壽命長且高度可用的對等點。

Kademlia攻擊

Kademlia一些值得注意的攻擊:

節點插入攻擊

由於無法驗證節點的ID,攻擊者可以選擇其ID以佔用網路中的特定金鑰空間。一旦攻擊者以這種方式插入自己,他們可能會審查或操作該keyspace或eclipse節點中的內容。

日蝕攻擊

Kademlia容易受到日蝕攻擊。這將在下一節中討論。

DHT漏洞和攻擊

日蝕攻擊

日蝕攻擊(Eclipse Attack)是針對對等式(或譯為點對點)網路的一種攻擊型別:攻擊者透過使節點從整個網路上消失,從而完全控制特定節點對資訊的訪問。

攻擊者利用了這樣一個事實:實際上在160位金鑰空間的大多數部分中,節點相對較少。攻擊者將自己注入比其他同伴更靠近目標的位置,最終可以取得統治地位。如果網路規則允許許多對等方來自同一IP地址,則可以廉價地完成此操作。

進行日食攻擊的成本在很大程度上取決於網路的體系結構,範圍從少數機器(例如,一臺機器上有數百個節點例項)到需要成熟的殭屍網路。

應對措施:

· 身份必須獨立於某些隨機預言。
· 節點與當前網路佈局之外的節點保持聯絡。

女巫攻擊

女巫攻擊是透過合謀節點來獲得對網路的不成比例的控制的嘗試,通常被用作其他攻擊的媒介。許多(如果不是全部的話)dht是在假設低部分節點是惡意的情況下設計的。女巫攻擊試圖透過增加惡意節點的數量來打破這一假設。

應對措施:

· 將成本與向網路新增新識別符號相關聯。
· 將真實的識別符號(IP地址、MAC地址等)可靠地連線到節點識別符號,並拒絕重複的閾值。
· 有可信的中心權威或安全的分散的方案來發布身份。
· 利用社交資訊和信任關係。

自適應聯動離開攻擊(Adaptive Join-Leave Attack)

假設我們有一個網路,它的節點id是透過一些隨機的oracle完全隨機選擇的。對手首先執行join/leaves,直到在該keyspace中有節點為止。之後,它們將進行輪次處理,保留位於I的節點並重新加入不屬於I的節點,直到在該時間間隔內獲得控制權為止。

需要注意的是,如果重新加入網路的成本足夠大,則會抑制此攻擊。在沒有這種抑制因素的情況下,布穀鳥規則被提出作為防禦手段。

結  論

DHTs是一種行之有效的分散式儲存和發現解決方案。特別是Kademlia,已經成功地實現並維持了與數百萬參與者的檔案共享和區塊鏈網路。與每一個網路一樣,它也不是沒有缺陷的,需要仔細的網路設計來減輕攻擊。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;