6.2 如何對比特幣去匿名化

我們已經強調過很多次比特幣僅僅是一個化名系統,所以你所有的交易記錄或者交易地址很有可能被關聯在一起。讓我們再進一步討論這種關聯是怎麼發生的。

圖6.1展示了維基解密的捐款頁面上的一個片段(包括本章開頭的時候就引用的一段),請注意那個在比特幣地址旁邊的刷新按鈕。可能你會期望通過點擊這個刷新按鈕,就會把接收捐款的地址換成一個全新生成的地址。類似地,如果你刷新頁面或者關閉這個頁面,重新再打開的時候,這個地址也會重新生成,而且是之前沒有出現過的。這是因為,維基解密需要保證每接收一筆新的捐款,都會對應一個新創設的僅用於此筆捐款的公鑰。維基解密這麼做就是最大限度地利用了可以創建新化名功能的作用。這事實上就是比特幣錢包實現匿名性的最好途徑。

圖6.1 維基解密的捐款頁面的一個片段

註:請注意那個在比特幣地址旁邊的刷新按鈕。維基解密遵循了為每一筆捐款生成一個新接收地址的比特幣匿名化的最佳實踐。

你可能覺得這些不同的地址一定是無法關聯的,維基解密收到的不同的捐款是完全分開的,並且推測它們可以分開使用每一筆捐款,但事實並非如此。

關聯性(linking)

假設愛麗絲想要去買一個茶壺,價格是8個比特幣(可能根據2015年的比特幣價格,實際情況應該是8分比特幣,1個=100分)。進一步假設,她的比特幣分在三個不同的地址裡面,分別有3、5和6個比特幣。實際上,愛麗絲沒有一個比特幣地址有足夠的8個比特幣,她必須要把兩個輸出合併成一個單體輸入,以支付給店舖。

隱形地址

假設鮑勃要通過他的網站還有廣告牌來宣傳他的捐贈地址。現在還沒有任何方式可以將一個不同的地址顯示給每個用戶,必然地,接收現場捐款的這個地址會很容易連接到鮑勃的站點。

能夠利索地解決這個問題的辦法,是利用隱形地址(stealth addresses)。它允許收件人鮑勃發佈一個靜態「永久」的地址,任何發件人(比如愛麗絲)由此可以派生出新的地址,該地址的私鑰只有鮑勃知道。

這是如何做到的呢?回憶一下橢圓曲線數字簽名算法(ECDSA)中的公鑰的函數形式是gx,其中的x是私鑰,地址函數是H(gx)。為了啟用隱形地址,鮑勃需要廣告公鑰本身,而不是長度更短的哈希值。然後,愛麗絲可以選取一個隨機數值r, 計算 (gx)r=gxr,並且將錢匯給這個公鑰。如果愛麗絲能夠單獨將數值r發送給鮑勃,鮑勃就可以計算出正確的私鑰xr,將匯到公鑰gxr的錢花掉。

這種方法並不完美,因為愛麗絲需要將數值r發送給鮑勃,而且還假定即使鮑勃不在線,比特幣交易照樣運行。為了解決這個問題,還有更複雜的協議,讓愛麗絲能夠有效地將數值r嵌入比特幣交易本身。隨後,鮑勃可以掃瞄區塊鏈,檢測針對他的交易,並恢復私鑰。黑暗錢包中使用了這種方法,該錢包設計時旨在增強隱私,並且類似的想法在加密簽名(CryptoNote)這種另類幣中有所使用。

那麼問題來了,這筆交易會在區塊鏈網絡裡有一個永久的記錄,任何看到這個記錄的人都可以推斷,這兩個輸入型交易很有可能是由同一個用戶控制的。換句話說,共享型消費,成為不同輸入地址聯合控制的證據。當然也可能存在例外,有可能愛麗絲和鮑勃是同寢室的朋友,決定一起聯合購買這個茶壺,並且分開付款。但是,大體來說,共同輸入基本上意味著共同控制。

圖6.2 多地址輸入交易

註:為了支付購買茶壺的錢,愛麗絲從兩個不同的比特幣地址創建了一個單一交易。這樣愛麗絲就暴露了一個事實,即一個個體控制了兩個不同的地址。

還不僅僅如此,攻擊者可以重複上述過程,從而一步一步將這個個體所進行的所有交易關聯起來。如果另外一個地址也關聯到了愛麗絲用於交易的兩個地址之一,那我們就知道所有三個地址都屬於同一個個體,我們可以因此建立一個地址簇(clustering of addresses)。一般來說,如果一個新地址的輸出,和該地址簇中的任何一個已知地址被一起花費,那麼這個新的地址也將會被加到該地址簇中去。

在本章6.4節,我們將會探討一種叫合幣(CoinJoin)的匿名技術,該技術的工作原理打破了上述設想。但是到目前為止,對沒有使用特別匿名技術的普通比特幣錢包用戶,這種簇技術還是非常有效的。接下來,我們很快將會討論如何把這種地址簇關聯到現實世界的身份。

零錢地址(change address)的隨機化

早期版本的比特幣類庫[Bitcoin-Qt library,現在又稱為比特幣中心(Bitcoin Core)]存在一個缺陷,對有兩個輸出地址的交易,它總把存放零錢的輸出地址放在第一個,這意味著很容易分辨出很多交易中的零錢地址。這個缺陷在2012年得到了修復,但是重點在於:錢包軟件在保護匿名性中扮演著非常重要的角色,如果你正在開發錢包軟件,你需要格外注意很多陷阱,尤其是你需要保證零錢地址的位置應該永遠是隨機的,以避免為攻擊者留下太多信息。

再回頭看一下我們的例子。假設這個茶壺的價格從8個比特幣上漲到了8.5個比特幣,愛麗絲發現,未用完的支出賬號裡無法再組合生成恰好可以支付這個茶壺所需要的金額了。取而代之的方案是,愛麗絲利用交易可以有多重支出的特性,如圖6.3所示,支出的其中之一就是茶壺店舖的接收地址,而另外一個則是愛麗絲自己的「找零」地址。

現在從其他人的視角來看這筆交易,他們可以推斷出這兩個輸入地址都屬於同一個用戶,他們甚至可能懷疑其中一個支出地址也屬於這個用戶,但是無法知道具體是哪一個。事實上0.5個比特幣雖然比其他的支出小,但是並不意味著這是一個零錢地址,愛麗絲可能有10 000個比特幣參與了交易,其中她支付了8.5個比特幣用於購買茶壺,而把剩餘的9 991.5個比特幣找零退回給了自己。在這樣的場景中,更大的輸出才是實際上的找零地址。

圖6.3 零錢地址

註:為了支付購買茶壺的錢,愛麗絲創建了一個交易,這個交易中的一部分比特幣去了商家的錢包,而剩餘的部分作為零錢退回給了她自己。

另外一種更好的解釋是,如果茶壺只需要花費0.5個比特幣,由於不管是3個比特幣還是6個比特幣的輸入地址,都足夠用來支付了,愛麗絲根本不需要創建兩個不同輸入組成的交易。但是,選擇哪種交易方式完全取決於通常使用的錢包軟件的特性,即使不是非常有必要,錢包(或者是用戶)還是可以隨意組合不同交易地址中的比特幣來完成支付的。

慣用法則

這種類型的實施細節被稱為「慣用法則」(idioms of use)。2013年,一組研究人員發現了大多數錢包軟件都在使用的慣用法則,並推導出一種用來鑒定零錢地址的強大方法。具體而言,錢包在有需要的時候都會生成一個全新的地址,因為這種慣用法則的使用,這些新的地址通常都是從來沒有在區塊鏈網絡出現過的。換句話說,非零錢地址通常都不是新地址,而是已經在區塊鏈網絡裡出現過的,那麼其他人就可以利用這個特性去分辨零錢地址,並把它和輸入地址相關聯。

依賴慣用法則來推測零錢地址可能會出錯。事實上,零錢地址是新地址這一特性不過恰巧是錢包軟件的一個特性。在2013年研究者測試的時候發現確實是這樣,現在可能還是,但也有可能不再如此了。用戶可以選擇覆蓋掉原來的默認設定,最重要的是,當對手瞭解了這種技術的時候就可以很容易迴避,即使是在2013年,研究者也發現這種特徵也會經常產生誤報,按照這種規則可以歸到一個簇的地址,不一定是屬於同一個個體的。研究者聲稱,他們需要大量的人工監督和干預才能去除這些誤報。

關聯真實世界的身份到地址簇

在圖6.4中,我們可以看到,米克爾·約翰(Meikle John)等人是如何利用慣用法則這樣的啟髮式算法來聚類比特幣地址的,但是這種簇沒有標籤——也就是說,我們還沒有關聯一個真實的身份到這個簇。

圖6.4 地址簇

註:摘自2013年的一篇論文「一把比特幣:尋找支付特徵」。在一組沒有姓名的用戶中,研究者將聯合支付的地址和全新的零錢地址歸類到一個比特幣地址簇。圖中,圓形的大小表示流入這些地址簇裡的貨幣數量,每一條線則代表一個交易。

我們可以根據所瞭解的比特幣經濟情況來做一個合理的推測。回到2013年,門頭溝公司曾經是最大的比特幣交易所,所以我們可以猜測圖中較大的圓圈代表的就是該交易所控制的地址,我們可能也注意到,圖中左側的深色的圓圈代表了很小的比特幣總量,但同時又有非常大的交易量,這個特性很符合叫作中本聰之骰(Satoshi Dice)的在線比特幣博彩遊戲,這個遊戲中,你可以發送微小量的比特幣作為賭注。總的來說,這並不是一個很好的方法來辨識地址簇,這需要很多背景知識和推測,可能僅僅對特徵比較顯著的案例有效。

利用交易進行標記

如果僅僅是通過訪問交易所或者商家的網站,以查詢其公佈的接收比特幣的地址,會怎麼樣呢?這其實沒有實際意義。因為大多數服務提供商都會針對每一個交易公佈一個新的地址,而這個新地址還沒有公佈在區塊鏈網絡上,等待這些地址發生交易沒有意義,因為這些地址通常不會再顯示給其他人。

唯一可靠的推斷地址的方法,是通過和這些服務提供商發生一個實際的交易,交存比特幣或者購買一個商品等。當你發送或者接收比特幣的時候,你將會知道它們所擁有的地址之一,而且很快這個地址就會在區塊鏈網絡上公示(並且是在其中一個簇中的)。於是你可以為這個簇打上該服務商的身份標識標籤。

這就是當時「一把比特幣」的研究者(以及自那之後的其他人)追蹤地址的做法,他們購買了不同的東西,加入了礦池,使用比特幣交易所、錢包服務、博彩網站,以及其他一些和這些服務提供商產生比特幣交易的行為,總計進行了344筆交易。

在圖6.5中,我們又一次看到了圖6.4的簇,只不過這一次貼上了附加的標籤,我們有關門頭溝公司和中本聰之骰的猜測是準確的,這些研究者同時辨識出一批其他的服務提供商,而如果不用交易的方式是很難標識它們的。

辨識個人

下一個問題是:我們是否可以對個人做同樣的動作?也就是說,我們是否可以關聯一些小的簇以辨識個人在真實生活中的身份?

直接交易。任何人和某個個人進行比特幣交易的時候——不管是線上還是線下的商家、交易所,或者一個用比特幣來分擔晚餐賬單的朋友——都可以通過這種直接交易,瞭解到他們的有效地址(至少一個)。

圖6.5 標籤簇

註:通過和不同的比特幣服務提供商進行交易,米克爾·約翰等人得以辨識並且標記這些簇在真實世界中的身份。

通過服務提供商。在使用比特幣幾個月甚至幾年的時間裡,大多數用戶都會跟交易所或者其他中心化的服務提供商有一些交集,這些服務提供商都會直接詢問用戶的真實身份——通常法律要求它們必須這樣做。這個話題我們將會在下一個章節討論。如果執法部門想要去辨識某一個個人,就可以直接去找這些服務提供商,要求它們提供數據。

疏忽。人們通常都會在公共論壇裡公示自己的比特幣地址,一個通常的原因都是通過這種辦法請求捐助。當有人這麼做的時候,其實已經創建了一個他們自己的身份和他們某一個地址的關聯,如果他們不使用我們將要探討的匿名服務,所有的交易都將會面臨被暴露的風險。

隨著時間的推移,針對隱私的攻擊會變得越來越有效率。歷史記錄表明,當越來越多的研究者去研究並開發出新的去匿名化的技術時,越來越多的數據會被公開,去匿名化的算法也由此隨著時間的推移而不斷得到改進。除此之外,會有越來越多的輔助信息可以幫助攻擊者去識別這些地址簇,如果你非常關心隱私,那麼這個問題就值得去擔憂。

目前,我們探討的去匿名化技術,都是基於對區塊鏈網絡上交易圖譜進行的分析,這些方法被歸納為交易圖譜分析(transaction graph analysis)。

網絡層的去匿名化

用戶被去匿名化,有很多種不依賴於交易圖譜的方法。為了在區塊鏈網絡中公示一個交易,一種典型的方法就是廣播這個交易到比特幣點對點的網絡中,在這個網絡中,消息會被相應地發送,但不一定要在區塊鏈網絡裡做永久記錄。

在計算機網絡術語中,區塊鏈被歸為應用層,而點對點的網絡則是網絡層。2011年,丹·卡明斯基(Dan Kaminsky)在黑帽技術大會(Black Hat)上首次提出了網絡層去匿名化的概念。他注意到,當某個節點創建一個交易時,該節點就會和其他很多節點建立鏈接並且廣播該筆交易。如果網絡上足夠多的節點串通起來(或者是被同一個攻擊者所控制的),他們就能分辨出第一個廣播交易的節點,並且可以因此推斷,這個節點就是被創建這個交易的用戶所擁有的。攻擊者因此可以把這個交易關聯到這個節點的IP地址,而IP地址已經非常接近於真實世界的個人身份了——有很多辦法可以發現某個IP地址背後的用戶身份。因此,網絡層去匿名化就是隱私保護的一個非常嚴重的問題(參見圖6.6)。

圖6.6 網絡層去匿名化

註:正如丹·卡明斯基在2011年黑帽技術大會上的演講中指出的,「第一個通知交易的節點很有可能就是交易源頭」。當有多個節點配合並且對同一個交易源頭進行識別的時候,這種方法的實際效果會更加明顯。

幸運的是,這是一個通信匿名性的問題,已經有很多研究在探索這個課題。正如我們前面在6.1節中已經看到的,Tor這個使用很廣泛的系統就是用來實現通信匿名性的。

在使用Tor系統為比特幣實現網絡層匿名化的解決方案的時候,有幾個注意事項。首先,在Tor的協議和任何基於此協議的上層協議之間,可能會有一些複雜的交互,由此可能會導致新的破壞匿名化的方法。事實上,研究者已經發現,在使用Tor協議之上的比特幣時,存在一些潛在的安全問題,使用這個方案的時候一定要非常小心。其次,可能有其他一些匿名通信的技術,會更適合比特幣的使用。Tor的定位是針對那些低延遲的活動,比如網頁瀏覽。在網頁瀏覽的時候,你也不想坐在那裡等半天,因此要取得低延遲,在匿名化方面可能要做出某些犧牲。相反,比特幣則是一個高延遲的系統,因為比特幣交易需要花時間來獲得區塊鏈上的確認。因此,至少在理論上我們可能更希望使用另外一種替代方案來實現匿名性,比如混幣網絡(Mix Net,參見本章6.3節)。但就目前來說,作為一個實際在運行的並且有廣大用戶基礎的系統,Tor還是有一些優勢的,而且這些用戶的安全問題已經被集中地研究過。

到目前為止,我們已經看到,通過交易圖譜分析的方法,不同的地址有可能被關聯在一起,甚至有可能進一步被關聯到真實世界的身份。我們也看到,基於點對點網絡,交易或者地址可能會被關聯到一個IP地址。對後一個問題,雖然我們現在還不能說可以完全解決,但至少解決起來相對容易。前一個問題就要麻煩很多,我們將在本章的後續部分,繼續探討如何去解決它。

《區塊鏈:技術驅動金融》