11-BTC-匿名性

聲明:本文是要點筆記,介紹和系列筆記均收錄在專題:區塊鏈技術與應用

什麼叫匿名(anonymity)?一般來說,匿名是跟隱私保護聯繫在一起的。比特幣中不要求用真名,可以用公鑰產生的地址,所以比特幣具有一定的匿名性。也就是你可以產生任意多的地址,然後用不同的地址幹不同的事情。它用的是化名,但它不是完全沒有名字,所以有人把它稱爲 preudonymity。

比特幣和銀行存款哪個匿名性更好?
銀行賬戶是實名制,你得提交身份信息,然後才能註冊銀行賬戶,而比特幣不需要,從這點上看比特幣匿名性要好。

其實,以前銀行是可以用化名的,如果銀行賬戶匿名的話隱私性和匿名性與比特幣相比哪個好?

銀行賬戶更好。比特幣區塊鏈的賬本是公開的,所有人都能查到,每個人都可以上區塊鏈把整個信息下載下來。而銀行的賬本是受控制的,銀行的工作人員可以查到,一些司法手段也可以調取銀行的信息,但普通百姓是查不到別人的賬的。

比特幣系統中什麼情況下有可能破壞匿名性?
有的人推薦每次收款都用一個新的地址,這樣的話可以有不同的地址,誰也不知道哪些是屬於你的,看起來好像匿名性很強,但實際上這些地址是可以被關聯在一起的。

比如網上購物,比特幣交易允許有多個輸入多個輸出。而多個輸入有可能是同一個人,因爲這個人可能同時控制了這兩個賬戶的私鑰。爲什麼要有兩個輸入:因爲你買的東西很可能不是你某個賬戶上全部的幣。有多個輸出,很可能有一個是找零錢的地址。這種交易一般都是比特幣錢包軟件生成的。很多交易軟件每次交易的時候都會生成一個新的找零的地址,也是爲了隱私保護。

有沒有可能把輸入地址和輸出地址也關聯起來呢?比特幣生成交易的時候並沒有規定,找零錢的地址在 outputs 中出現的位置,所以想知道哪個是找零的地址也並不容易,但有些情況下可以分析出來。

比如第一個地址賬戶上有 4 個比特幣,第二個有 5 個。產生的兩個輸出第一個輸出轉入 6 個比特幣,第二個輸出轉入 3 個比特幣。那很明顯轉入 3 個比特幣的輸出是找零的,因爲如果它是商家的地址,就用不着兩個 inputs,任意一個輸入都比 3 大。通過這種方法我們可以把輸入地址和輸出地址也關聯起來。

如果想要更好的隱私保護,可以產生一些沒必要的輸出,爲了迷惑別人。但是這些交易幾乎都是用錢包軟件生成的,現在很少有人手工生成這些比特幣的轉賬交易,常用的比特幣錢包就那麼幾種。所以把常用的比特幣錢包生成交易的方式搞清楚,那麼區塊鏈上很大一部分轉賬交易都可以分析出來。常用的錢包到目前爲止一般沒有故意生成一些不必要的輸出地址。

有可能破壞比特幣匿名性的第一個方面:一個人可以生成很多個地址賬戶,但這些地址賬戶是有可能被關聯起來的。第二個方面:是這個地址賬戶跟現實世界中的身份也可能產生關聯。什麼時候會有關聯?什麼情況下別人有可能知道比特幣賬戶對應的現實生活中的哪個人呢?

比特幣系統一旦跟現實世界聯繫起來,就可能泄露你的真實身份,最明顯的例子就是資金的轉入和轉出。怎麼避免用比特幣洗錢呢?盯住比特幣的轉入轉出鏈是一個常用的手段。大筆的比特幣和貨幣的交易想不引起司法部門的注意是很難的,轉入轉出也是比特幣隱私容易被破壞的一個很重要的時機。

還有什麼時候會泄露真實身份?用比特幣做支付的時候。在實體世界中用比特幣做支付,比如國外有的商家是接受比特幣支付。但有一些麻煩之處:1、延遲很長,等到交易確認,要等六個區塊生成,即一個小時。2、交易費很貴。如果買咖啡,交易費可能都跟咖啡差不多貴了。這樣的話,你支付的賬戶就跟你的真實身份建立聯繫了。這個賬戶可能跟個人的其他賬戶也是有聯繫的,所以這樣很容易泄露個人隱私和身份。而且該交易不僅是該商家會知道,其他人也會知道。

比如:A 想知道 B 的地址。A 可以在 B 去買商品時,留意 B 支付的時間,然後去查找在這個時間點的交易。在 B 下一次購買商品時也留意支付時間,這樣下去用不了幾次就能知道哪個哈希值是 B 的。

這個例子告訴我們什麼?信用卡記錄不能公開,即使匿名,也不應將公鑰取哈希後公開。但比特幣系統是無法保密的,所以比特幣的匿名性並不是絕對的,沒有想象中那麼好。

實際中用比特幣的人匿名性保存的怎麼樣?中本聰發明比特幣以來,沒有進行過任何一筆交易,所以到現在也沒人知道他的真實身份。曾經有一個叫絲路(silk road)的網站(eBay for illegal drugs),像 eBay 一樣的網上交易平臺,但賣的都是非法的違禁品。爲了逃避司法制裁,其支付手段就是比特幣,底下的網絡層用的是洋蔥路由(TOR),在美國也有匿名郵寄的服務。最後運行了兩三年,就被查封了。美國政府抓到其老闆時,沒收了其十幾萬個比特幣,在當時價值幾千萬美元。但他生活簡樸,因爲雖然有價值連城的比特幣,但一旦消費就會暴露身份。

該網站被查封之後,有人又開了 silk road2。也是運行沒幾年就被查封。還有一些類似的網上黑店,最後下場都不好。這些事件都說明了,比特幣的匿名性沒有我們想象中的那麼好,尤其是想用它來做壞事。

所以回到前面的問題:比特幣的匿名性有多好?匿名是跟隱私保護相關聯的,但問題在於:你不想向誰暴露身份(hide your identity from whom)?如果你不想讓身邊的親戚朋友知道,這是比較容易實現的。如果是非法組織,從事黑市活動,那保護起來就難多了。

一個比特幣用戶能採用什麼樣的方法儘量提高個人的匿名性?
以前曾講過,比特幣系統是運行於應用層(application layer)的,底層是(network layer)。所以要提高匿名性可以從兩個方面入手。

1、網絡層怎麼提高匿名性?
在現實中,如果一個人去網吧發了帖子,別人是有辦法知道他是誰的。因爲他的身份證代表了他的身份,這和他的 IP 地址是有很大關聯性的。

而網絡層的匿名性是比較好解決的。區塊鏈是個新生事物,但網絡層的匿名性,學術界已經有了很好的方案:多路徑轉發。跟洋蔥路由(TOR)是一樣的原理。即消息不是由發出者直接發送給接收者,中間要經過很多次轉發。中間的每一個節點,只知道它的上一個節點是誰,但並不知道最早發出消息的人是誰。當然中間一些節點可能是壞的,但路徑上只要有一個節點是誠實的,就能夠把最初發起人的身份隱藏起來。這也是洋蔥路由的基本原理。

2、應用層怎麼提高匿名性?
把不同人的幣混在一起(coin mixing),即把你的身份跟別人的身份混在一起,讓別人分不清楚誰是誰。不光是區塊鏈,在其他各個需要匿名的領域都能用到。有一些專門做 coin mixing 的網站,提供一定的服務收取一定的服務費。所有想做 coin mixing 的人把幣發給網站,網站內部進行一些重組,然後你再把幣取回來,這時取出的幣就不是發佈到網站上的幣了,它是隨機抽取一些幣給你。

coin mixing 真正實施起來有一定的複雜性,如果設計不好的話,別人可以根據你當初存進去幣的數額,推斷出來哪些幣,是你存進去的。

而且,在當今的區塊鏈的世界裏,沒有什麼信譽度非常高的 coin mixing 的服務。很多 coin mixing 的服務它本身也是要保持匿名的,它匿名的後果是:有可能投進去的幣被他捲款跑路了,投幣者是一點辦法都沒有的。

實際上並不一定非要做 coin mixing,有一些應用本身也帶有 coin mixing 的性質,比如在線錢包。很多人會把錢存入在線錢包裏,在線錢包就會把這些人的幣混起來,再取回自己的幣時可能就不是當初存進去的幣了。但在線錢包並不保證要履行 coin mixing 的功能。

還可以通過加密貨幣的交易所,交易所一般有天然的 coin mixing 的性質。前提是交易所不會泄露提幣、存幣的記錄,否則也是不行的。

爲什麼保護隱私性難度挺大?本質原因是區塊鏈是公開的,而且是不可篡改的。不可篡改性對於隱私保護來說是災難性的。

零知識證明

如上圖,零知識證明是指一方(證明者)向另一方(驗證者)證明一個陳述是正確的,而無需透露除該陳述是正確的外的任何信息。

例如:要證明一個賬戶是我的,只需要我給出私鑰就行。但私鑰不能直接泄露,所以就給出由私鑰產生的簽名,假設對方是知道這個賬戶的公鑰的,那麼就可以驗證簽名的正確性。這是不是一個零知識證明其實是有爭議的,因爲我給出了私鑰之外的其他信息,具體算不算要看應用場合。

同態隱藏

零知識證明的數學基礎是同態隱藏。

上圖是同態隱藏的性質。

第一個性質說明:加密函數值 E 不會出現碰撞,這跟哈希函數有所不同,哈希函數是可能出現碰撞的。這個性質反過來說明如果 E(x)和 E(y)是相等的,那麼 x、y 也是相等的。(該語句是上面語句的逆否命題)

第二個性質說明:加密函數是不可逆的,知道加密後的值,沒辦法推出加密前的值。

第三個性質是最重要的,叫作同態運算。它說的是對加密之後的函數值進行某些代數運算,等價於對這些輸入直接進行代數運算然後再加密。

  • 同態加法:加密值的和等於和的加密。
  • 同態乘法:加密值的乘積等於積的加密。

舉一個例子:如下圖所示 Alice 想要向 Bob 證明她知道一組數 x 和 y 使得 x+y=7,同時不讓 Bob 知道 x 和 y 的具體數值。

簡單的解答版本如下圖:

  • Alice 把 E(x)和 E(y)的數值發給 Bob
  • Bob 通過收到的 E(x)和 E(y)計算出 E(x+y)的值(利用了性質 3)
  • Bob 同時計算 E(7)的值,如果 E(x+y)=E(7),那麼驗證通過,否則驗證失敗。

Bob 可以用蠻力算法,一個一個試而計算出 x 和 y 的值,因此 Alice 要對 x 和 y 的值做一些隨機化處理,保證 x 和 y 加起來還是不變的。

不考慮去中心化的前提下,前面在講雙花(double spending)時講過,要對每一個數字貨幣進行編號就能防止雙花(double spending)。回到這節課講的隱私保護問題,央行是什麼都知道的,那麼有沒有什麼辦法讓央行做中心化的記賬檢測雙花(double spending),又不讓它知道呢?即虛擬貨幣的編號不能是央行產生的,改成自己產生的,又不會被篡改掉。

這裏就要用到盲籤方法。如下圖所示:

  • 用戶 A 提供 SerialNum,銀行在不知道 SerialNum 的情況下返回簽名 Token,減少 A 的存款
  • 用戶 A 把 SerialNum 和 Token 交給 B 完成交易
  • 用戶 B 拿 SerialNum 和 Token 給銀行驗證銀行驗證通過,增加 B 的存款
  • 銀行無法把 A 和 B 聯繫起來
  • 中心化

解讀如下:

  • 用戶 A 提供序號,銀行進行簽名但此時看不到序號的內容,A 要取錢,所以銀行要減少 A 的存款。
  • A 給 B 轉賬交易的時候把序號和簽名給 B,這個時候序號是明文,B 是可以看到序號的具體內容的。
  • B 把序號和簽名給銀行驗證,這個時候序號也是明文,這一步驗證的目的是檢測雙花(double spending)。

這樣設計的好處是:銀行不知道 B 的幣是從哪來的。

零幣和零鈔

零幣和零鈔(它們也是加密貨幣,跟比特幣是一類屬性):比特幣在很大程度上提供了匿名性,但它不能完全消除關聯性,那麼我們能不能設計一種新的加密貨幣,這個貨幣從一開始的結構設計上就用了密碼學的原理保證了匿名性,所以就有了零幣和零鈔。

上圖陳述的是零幣和零鈔的含義。

  • 零幣和零鈔在協議層就融合了匿名化處理,其匿名屬性來自密碼學保證。
  • 零幣(zerocoin )系統中存在基礎幣和零幣,通過基礎幣和零幣的來回轉換,消除舊地址和新地址的關聯性,其原理類似於混幣服務。
  • 零鈔(zerocash)系統使用 zk-SNARKs 協議,不依賴一種基礎幣,區塊鏈中只記錄交易的存在性和礦工用來驗證系統正常運行所需要關鍵屬性的證明。區塊鏈上既不顯示交易地址也不顯示交易金額,所有交易通過零知識驗證的方式進行。

這是專門爲匿名性設計的加密貨幣。

零幣中存在基礎幣(比如比特幣)和零幣。用的時候要證明本來是有一個基礎幣,讓基礎幣變得不能花費(unspendable),然後換取一個零幣,零幣在花的時候只需要用零知識證明你花掉的幣是系統中存在的某一個合法的幣就行了,但是不用透露你花的是系統中具體的哪一個幣。這是跟比特幣的一個本質區別,比特幣是每一筆轉賬交易都要說明幣的來源。這樣才能證明花的幣的真實性不是憑空捏造出來的。

但零幣和零鈔不是這樣,零幣和零鈔是說證明的時候可以從數據上保證你花的幣是以前區塊鏈上某個合法存在的幣,但不知道具體是哪個。這樣的話就把關聯性破壞掉了,就沒法追溯了。

零鈔沒有基礎幣,是完全的零幣。零鈔和零幣也不是 100%匿名安全的,在影響匿名安全的因素中依然有一個因素無法解決,就是與實體發生交互的時候。比如有人想拿這些幣幹壞事,把很大的金額轉換成這種加密貨幣的時候,或者是把這些加密貨幣轉換成現金的時候,仍然要暴露身份。這些加密貨幣數學上設計的再好,只是說對已經在區塊鏈當中的轉賬有匿名性,跟外界交互的匿名性仍然是一個弱點。所以它依然無法提供 100%的匿名。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章