熵衡量指紋訊號有多罕見,獨立訊號的位元會彼此相加,一旦超過約33位元,你在全球近80億人中就變得獨一無二;匿名集則是與你目前指紋相同的那群人。
重點摘要
- 熵衡量的是「意外程度」。 一項訊號唯有在其數值罕見時才具追蹤價值——常見數值幾乎不會增加辨識度。
- 熵會累加。 大致獨立的訊號在位元數上是「相加」的,這正是為什麼幾項看似普通的屬性組合起來,也足以讓你變得獨一無二。
- 約 33 位元 ≈ 全球唯一,因為 2 的 33 次方接近世界人口——這個門檻只是一個人口規模的近似值,並非固定不變的定律。
- 你的匿名集,就是此刻與你共享同一指紋的「1 比 N」人群——這個群體越大越安全,而追蹤指令碼每多讀取一項罕見屬性,這個人群就會縮小一分。
- 行動裝置並非天生更安全。 量產手機拉平了 Canvas 與 WebGL 的熵,卻也補上了桌機所沒有的觸控與感測器訊號——改變的是訊號組成,而不是總量。
熵究竟在衡量什麼
「熵」聽起來很抽象,但背後的道理其實很簡單:只有出人意料的訊號才具有資訊量。 如果每個造訪網站的人都用著相同的螢幕解析度,那這項解析度對追蹤者毫無用處。而如果幾乎沒有人與你共用同一套已安裝字型組合,那這項屬性幾乎能把範圍縮小到只剩你一人。
嚴格來說,某個觀測值的*意外度(surprisal)*是 -log2(p) 位元,其中 p 是該數值出現的機率。一個被半數瀏覽器共享的值攜帶 1 位元的意外度(-log2(0.5) = 1);一個僅被 1024 個瀏覽器中的 1 個共享的值,則攜帶 10 位元(-log2(1/1024) = 10)。數值越罕見,貢獻的位元就越多——而位元正是追蹤者實際上逐項在收集的東西。
這也是為什麼「屬性數量」本身是衡量指紋風險的錯誤方式。十項常見屬性加總起來,貢獻的辨識度可能還不如一項罕見屬性。真正重要的,是每個數值有多出人意料,而不是有多少個數值。
熵如何跨訊號累加
單一訊號很少能獨自決定身分——參見指紋腳本能讀取的完整訊號清單,從 User-Agent、時區,到 Canvas 與 WebGL 輸出皆包含在內。它們的威力來自組合。由於大致獨立事件的機率是相乘的,而 log2 會把乘法轉換成加法,來自不同訊號的熵便單純地「相加」:總位元數 ≈ 各訊號位元數之和。
這種可加性正是指紋識別背後的全部機制。一段 Canvas 雜湊 或 WebGL 算繪器字串,光是單獨一項就可能貢獻兩位數的位元,因為它們同時編碼了 GPU 型號、驅動程式版本與作業系統的算繪細節。但那些看起來平淡無奇的屬性同樣攜帶位元,而腳本會在同一次讀取中把它們一併收走。這些訊號單獨來看都不算突出——危險純粹是算術層面的。
EFF 最初的 Panopticlick 研究直接測量過這一點:在約五十萬個瀏覽器樣本中,收集到的指紋分布攜帶約 18.1 位元的熵,意味著在該樣本中,隨機一個瀏覽器的指紋平均只會與約 286,777 個瀏覽器中的 1 個重合。在該資料集裡,83.6% 的瀏覽器擁有當場唯一的指紋——在啟用了 Flash 或 Java 的訪客中,這個比例更高達 94.2%。逐項拆解便能看出這些位元從何而來:光是 User-Agent 字串就攜帶約 10 位元,系統字型清單約 13.9 位元,瀏覽器外掛清單約 15.4 位元;而「是否啟用 Cookie」這種粗糙的訊號只有區區 0.35 位元。原始數據可參閱 EFF 對 Panopticlick 結果的總結。
2010 年之後有兩件事朝相反方向發展。當年資料集中資訊量最大的訊號——外掛列舉——隨著 NPAPI 外掛退場已幾乎失效,User-Agent 字串也被刻意凍結並精簡(參見 User-Agent 精簡)。但瀏覽器同時也長出了 Panopticlick 從未測試過的介面——音訊、媒體裝置、WebGL、Canvas 等等——因此把今天完整的屬性集組合起來,腳本拿到的熵仍在同一量級,甚至更高。
有一點比任何單一數字都更重要:唯有當訊號真正彼此獨立時,位元才能乾淨地相加,而現實中的訊號並不獨立。 一段 Android 的 User-Agent 就已經能推斷出字型清單、螢幕幾何與 GPU 字串的大部分內容;知道其中一項,也就等於知道了其餘的許多。這正是為什麼 Panopticlick 各單項屬性的熵加起來超過 50 位元,而整個指紋實測的聯合熵只有 18.1 位元。把每個訊號的位元直接相加,得到的是上界而非估計值——真實數字總是更低;看到任何工具給出的總熵值時,都該把這一點放在心上。
匿名集:用「1 比 N」來思考
熵對研究者而言是個有用的數字,但更直觀的框架是匿名集:在追蹤者眼中,此刻與你看起來完全一樣的那群人。如果你的指紋熵為 b 位元,你的匿名集大致是「1 比 2 的 b 次方」——在 10 位元時,大約每 1024 人中有 1 人與你完全相同;在 20 位元時,約百萬分之一;在 30 位元時,約十億分之一。
這也是為什麼約 33 位元是「全球唯一」的非正式門檻。世界人口約 80 億,而 2 的 33 次方 ≈ 86 億,一個攜帶 33 位元熵的指紋,其匿名集大約就是 1——也就是你自己,幾乎沒有其他人,這還沒把這 80 億人裡有多少人真的在上網算進去。值得說清楚這個門檻究竟是什麼:它是與目前世界人口掛鉤的一個近似值,而非固定常數。隨著全球人口增長,達到「全球唯一」所需的位元數會一點一點爬升;這是一個會移動的目標,只不過移動得非常緩慢。
一種常見組合——普通的 User-Agent、常見螢幕尺寸、預設字型、標準時區——可能讓你落在一個數千甚至數百萬人的匿名集裡,這是個相當安全的位置。但只要再加上一款罕見字型、一段不尋常的 WebGL 算繪器字串,以及一套獨特的音訊堆疊,這個群體就可能在寥寥幾項額外訊號之內坍縮到只剩你一人——原因還是那句話:位元是會相加的。
為什麼罕見的組態對你不利
這個結論在直覺上有點反常:真正的問題在於「顯得與眾不同」,而不是被某項單一屬性追蹤。 一台配備獨特高階顯示卡的電競筆電、一種罕見的地區鍵盤配置、一款小眾瀏覽器擴充功能——這些東西不需要任何一項單獨保密,組合本身就足以讓匿名集坍縮。這也是為什麼建立在隨機化之上的隱私工具存在一個微妙的風險:如果「被隨機化」這件事本身可被偵測出來,那麼「這個瀏覽器的 Canvas 值明顯是偽造的」反而可能成為一項罕見、具辨識度的屬性——具體的取捨可參閱 Canvas 雜訊 vs 真實雜湊:隨機化為何弄巧成拙。而建立在一致化之上的工具——例如 Tor 瀏覽器與 Firefox 的 resistFingerprinting——則是直接針對匿名集下手:讓整個使用者群體回報的位元都保持一致,而不是試圖藏起其中某一項。
行動裝置 vs 桌上型裝置:同一套數學,不同的數字
熵的分析框架是通用的,但由此得出的數字會因平台而異,差異相當顯著。桌上型 PC 擁有極其龐大的 GPU、驅動程式、螢幕與字型組合,因此Canvas 與 WebGL 訊號在桌機上往往攜帶較高的熵。量產手機硬體恰好拉平了這些訊號——數以百萬計的相同裝置算繪 Canvas 與 WebGL 輸出的方式完全一致,因而削弱了它們對總位元數的貢獻。但行動裝置也帶來了桌機大多不具備的訊號——螢幕幾何細節、觸控點數量與動作感測器——這在一定程度上抵銷了前述的拉平效應。綜合結果是:手機的匿名集並不會自動比桌機更大,只是由高熵與低熵訊號構成的組合不同罷了。具體 Android 與 iOS 裝置是如何被追蹤的,參見行動裝置瀏覽器指紋識別。
如何檢視自己的匿名集
熵這個數字很難憑空理解——了解自己數值最快的辦法,就是實際測一測。BrowserInsight 的指紋檢測工具完全在用戶端運行,會估算你目前組態的獨特程度,並拆解出哪些訊號貢獻了最多位元。EFF 的 Cover Your Tracks(Panopticlick 的後繼工具)也會針對其自身彙整的資料集,給出類似的「1 比 N」數字。分別執行兩者,再在啟用隱私瀏覽器或擴充功能前後各測一次做比較,是判斷某項防禦是否真的擴大了你的匿名集最清楚的方法——因為如上文所示,答案完全取決於它改變了哪些訊號,以及改變了多少。
常見問題
熵值越高就一定越糟嗎?
對你自身隱私而言,是的——位元越多意味著匿名集越小、瀏覽器越容易被識別。熵是你目前具體屬性組合的一項性質,而非固定分數;只要你換瀏覽器、更新字型,或啟用某項防禦,它就會改變。
刪除 Cookie 會降低我的指紋熵嗎?
不會。熵來自裝置與瀏覽器特徵——GPU、字型、算繪細節——這些都不是以 Cookie 形式儲存的。清除 Cookie 對指紋腳本能讀到的位元沒有任何影響;參見完整的指紋指南,了解為什麼指紋能在資料被清除後存活,而 Cookie 卻不能。
我能擁有零熵——一個徹底匿名的指紋嗎?
在開放網路上做不到,但可以非常接近。那些把你的數值統一到一個龐大群體的工具(Tor 瀏覽器、Firefox 的 resistFingerprinting)並不是把訊號藏起來,而是讓所有人都回報同一套值,於是這些屬性貢獻的位元趨近於零。剩下的熵,來自它們無法統一的部分,例如網路層特徵與時序行為。那個共享的基準值,就是在正常瀏覽的前提下,匿名集大小所能達到的實際上限。
為什麼不同來源對「同一個」指紋給出的熵值不一樣?
熵是相對於特定資料集測量出來的。EFF 的 Panopticlick 研究是針對 2010 年造訪其自身網站的瀏覽器測量熵值;今天在另一個網站上運行的腳本,面對不同的訪客群體與不同的屬性清單,即便是同一台實體裝置,也會算出不同的數字。位元是相對於資料集而言的,並非絕對量。


