CreepJS、指紋熵值檢測與廠商匿名分數看似都在打分數,卻分別衡量三種不同的東西,難怪同一個瀏覽器會得到三種矛盾的結果。
把同一個瀏覽器接連丟進兩個指紋測試工具,你很可能拿到兩個看起來完全矛盾的答案。一個工具告訴你「四十萬分之一」——這個說法聽起來令人安心,實際意思卻是:在這個工具的樣本裡,沒有第二個人長得跟你一樣;另一個給你 62% 的信任分數,還標記出一堆不一致;第三個則只丟下一句「高度獨特」,沒有任何解釋。它們都沒有錯。問題在於它們根本不是在衡量同一件事,而「分數」這個詞,恰恰把這個落差掩蓋得很好。
核心要點
- 指紋測試工具用同一個「分數」字眼,實際上回報的是三種截然不同的量:唯一性(你的訊號組合有多罕見)、連貫性(你的訊號彼此是否矛盾),以及廠商匿名綜合分數(廠商私下自訂權重混合出的結果)。
- 唯一性是一種資訊理論的量測,不是一種判決——數值高只代表你容易被識別出來,不代表你的瀏覽器有任何損壞或造假。
- 連貫性比較接近測謊:一個完全連貫的瀏覽器仍然可以高度獨特,而一個看起來高度匿名的瀏覽器,也可能通不過連貫性檢查。
- 強化瀏覽器的防護,可能同時把這兩個數字推向相反的方向——這是任何一份指紋報告的讀者最該記住、也最反直覺的一件事。
- 就連兩個唯一性檢測工具之間也會互相打架,因為每一個都是拿自己那批「自行找上門」的訪客當分母——罕見度數字的意思永遠是「在這個工具的訪客裡有多罕見」,而不是「在整個網際網路上有多罕見」。
- 只讀得到瀏覽器 API 的測試,沒辦法把你的時區拿去對照你的 IP 實際解析到哪裡:這項比對需要一台真的看見你這條連線的伺服器,因此它天生就落在所有「純瀏覽器端分數」的範圍之外。
同一個詞,背後其實是三個不同的問題
「分數」這個詞,暗示著只有一把尺可以衡量。但實際上,你會遇到的每一個指紋測試,回答的都是三個獨立問題中的一個——把這三者混為一談,正是為什麼同時開著兩個分頁、分別跑兩個不同的測試工具,會感覺像在講兩個不同的瀏覽器。
唯一性問的是:在所有曾經被量測過的人裡面,有多少人跟你的訊號組合完全一樣?這是一個用資訊理論回答的母體統計問題——各項訊號的「位元」如何加總成單一數字,完整機制可見瀏覽器指紋熵與匿名集詳解。如果你想拋開瀏覽器情境、單純看懂背後的數學,EFF 自己寫的入門文章是很好的簡短讀物:資訊理論與隱私入門。
連貫性問的則是完全不同的問題:你的瀏覽器暴露出來的這些訊號,合理來說是不是出自同一台真實裝置,還是看起來像被動過手腳?CreepJS 的測謊模型是最清楚的公開範例——它不在乎你的指紋有多罕見,只在乎你的各項屬性,能不能在多條獨立程式碼路徑上彼此吻合。指紋一致性:為何訊號矛盾會讓你被標記則從偵測系統的角度談同一件事:一個聲稱是 Safari 的 user-agent,旁邊卻搭配一個只可能出現在 Windows 機器上的 GPU 算繪器字串,這就是連貫性失敗——不管這兩個值各自有多常見或多罕見都一樣。
廠商匿名綜合分數是第三類,也是最不透明的一類。商業指紋識別產品經常會發布一個單一的百分比或等第,用來概括「這位訪客看起來有多值得信任」,這個數字是唯一性、連貫性訊號,再加上廠商不願公開的專有啟發式規則,混合而成的結果。這種混合權重並沒有共通的業界標準——A 廠商的 80% 跟 B 廠商的 80%,用的根本不是同一套配方,因為每家廠商都可以自行定義自己的那一套。任何單一廠商的數字,都該被當成該廠商的「意見」,而不是前兩項那種意義下的量測值。
每項指標能告訴你什麼、不能告訴你什麼
唯一性告訴你的是,在會對你做指紋識別的網站之間,你有多容易被追蹤辨識出來——它完全不會告訴你,你的瀏覽器看起來是否被動過手腳。一個完全原廠、沒有任何修改的瀏覽器,只要搭配一組不常見但貨真價實的硬體與字型組合,就可能被判定為高度獨特,同時卻完全連貫。高唯一性是一個隱私問題(你容易被追蹤),而不是詐騙系統眼中的警訊。
這裡還有一個前提,能解釋兩個唯一性檢測工具之間的大量分歧:分母永遠是那個工具自己量測過的那群人,而這群人是「自行找上門」的——會特地去跑指紋測試的人,隱私意識遠高於一般網路使用者。所以罕見度數字真正的意思是「在這個工具的訪客裡有多罕見」,而不是「在整個網際網路上有多罕見」。同一個完全沒動過的瀏覽器,在兩個熵值檢測工具那裡拿到兩個不同的數字,雙方都可能只是誠實地回報了各自的樣本而已。
連貫性告訴你的是,你的各項訊號是否彼此吻合,卻完全不會告訴你這個組合有多罕見。Firefox 的 privacy.resistFingerprinting(在 Tor Browser 中永遠開啟)會讓每一個使用者都回報同一套標準化的值,這反而會把唯一性壓低——製造一個龐大而整齊的人群,本來就是它的全部設計目標。但這些值是被替換掉的,而不是裝置原生的;一個從多條獨立程式碼路徑去觸碰同一個屬性的測謊器,往往看得出破綻。於是就出現這種局面:一個在唯一性測試裡接近「匿名」的瀏覽器,在連貫性報告上照樣可能亮紅燈。在正式環境的詐騙評分與機器人防禦系統裡,連貫性失敗的份量遠高於唯一性,因為一台未經改動的裝置很少會以那種特定方式自相矛盾。這裡用的詞是「很少」而不是「絕不」:隱私功能、企業統一管控的設定,以及冷門或老舊裝置,同樣會觸發真實的連貫性告警——所以連貫性標記該被當成一條值得追查的線索,而不是一紙判決。
廠商綜合分數告訴你的,是這家公司的模型「目前」怎麼權衡它所使用的輸入條件——而這套權重可能在產品改版之間悄悄變動,你完全不會知道。它們可以當作那家廠商觀點下的粗略參考,但不是一個可以直接拿去跟其他工具的輸出比較的通用數字,也沒辦法在不說明是哪家廠商產出的情況下,就向別人解釋清楚。
最反直覺的一點:強化防護可能讓兩個數字背道而馳
這正是讓指紋報告真正令人困惑、而不只是囉唆的細節:對瀏覽器做一個改動,可能同時讓一個數字上升、另一個數字下降。
安裝一個會偽造或隨機化少數訊號的擴充功能——偽造的 Canvas 雜湊、抖動過的 WebGL 參數——可能會在某次造訪時降低你量測到的唯一性,因為那天回報出去的值剛好比較常見。但隨機化本身,也是連貫性檢查工具抓得到的一種模式:Canvas 雜訊 vs 真實雜湊:隨機化為何適得其反說明了為什麼「這個 Canvas 值每次重新整理都會變」本身就是一種破綻,而且有時候比一個穩定、獨特的值還更糟。同一個瀏覽器,在連貫性檢查工具眼中變得更可疑的同一個瞬間,對唯一性檢查工具而言卻變得更「常見」。
反過來也一樣會發生。一個完全原廠的瀏覽器——沒裝任何擴充功能、全部使用預設值、字型就是作業系統內建的那一套——通常在連貫性上會拿到很好的分數,因為看起來完全沒有被動過手腳。但「完全原廠」對 GPU 型號、已安裝字型清單和螢幕幾何規格來說,本身往往就是一種與眾不同的組合,反而可能把唯一性推高,而不是拉低。沒有任何單一動作能可靠地同時改善這兩個數字;任何防護手段都必須分別針對這兩項指標評估,因為一場只回報其中一項的測試,只讓你看到了一半的全貌。
所有純瀏覽器端測試共有的盲點
到目前為止討論過的每一個工具——唯一性檢測器、CreepJS、廠商綜合分數——都是在你的瀏覽器內部替你打分,依據只有 JavaScript 從瀏覽器自身 API 讀得到的東西。這讓它們全都共有同一個結構性的盲點:那整套 API 裡,沒有任何一項會告訴腳本它的連線最後是從哪裡出去的。Intl.DateTimeFormat().resolvedOptions().timeZone 回傳的只是瀏覽器被設定成要回報的值,它既說明不了請求走了什麼路由,也說明不了對面的伺服器看到的是哪個 IP。
時區與語系對照 IP 地理位置這項比對,正是正式環境偵測系統最常用、成本也最低的訊號之一——原因就在於,它整個落在「瀏覽器屬性」這一層之外。一個瀏覽器可以回報一組完全連貫、完全合理的時區與語言搭配,同時卻坐在一個位於完全不同國家的 VPN 出口節點後面,而不論你在這個瀏覽器內部再怎麼加碼探測,都不可能把這處矛盾挖出來。要補上這個缺口,需要第二次、來自伺服器端的觀測:查出這條連線實際是從哪個 IP 進來的,再拿去跟瀏覽器自稱的內容對照。BrowserInsight 的 VPN/代理檢測正是圍繞網路側這一半打造的,而指紋檢測也把同一套伺服器端的位置查詢接進了它的一致性判定——這恰恰是一個純靠瀏覽器屬性替你打分的頁面,自己補不上的那一塊。
該如何解讀一整組結果,而不是死盯著一個數字
以上這些都不是教你如何拉高任何一個分數——這三個數字之所以存在,是因為它們回答的是不同的威脅問題,不是因為其中一個是「真正」的分數、其他兩個只是它的近似值。該關注哪一個,取決於你實際擔心的是什麼:
- 擔心自己在不同網站之間被追蹤、被建立側寫?相關的數字是唯一性——如何解讀你的匿名集,可參見瀏覽器指紋熵與匿名集詳解。
- 擔心自己在互動的網站眼中看起來像自動化程式或被偽裝過?重要的是連貫性,這也正是像 CreepJS 這類工具,以及像機器人偵測測試頁解析:Sannysoft 與 CreepJS 這類公開通過/失敗測試工具,被設計出來要揭露的東西。
- 因為你經營的網站採用了某家廠商的產品,需要評估特定廠商的方案?他們的綜合分數,只有在那家廠商自己說明的權重脈絡下才有意義——把它當成他們的意見,而不是一種放諸四海皆準的量測標準。
單一工具給出的單一數字,從來就不可能同時回答這三個問題。執行 BrowserInsight 的指紋檢測,可以看到底層訊號被逐項攤開——Canvas、WebGL、字型、TLS、navigator 屬性——並與它們彙整出的一致性判定並排呈現,而不是被壓縮成一個數字;再搭配 VPN/代理檢測,就能拿到純瀏覽器端測試無法完成的網路側比對。
常見問題
哪一個指紋測試工具給出的分數才是「正確」的?
沒有哪一個,因為它們根本不是在競爭回答同一個問題。唯一性檢測器、像 CreepJS 這樣的連貫性檢測器,以及廠商自家的專有綜合分數,各自量測的都是不同的東西;問哪一個才「正確」,就像在問溫度計和氣壓計哪一個給出的天氣讀數才「正確」一樣。
如果我的唯一性分數很高,代表我看起來很可疑嗎?
不會。高唯一性只代表你在多次造訪之間容易被識別出來——這是一個隱私層面的問題——不代表有任何東西看起來造假或被動過手腳。一個原廠、未經修改的瀏覽器,只要搭配一組不常見但完全真實的硬體組合,就可以同時既高度獨特、又完全連貫。
我可以透過一個改動,同時改善唯一性和連貫性分數嗎?
不太可靠。這兩者衡量的是不同的東西,一個能改善其中一項的改動——例如隨機化某個訊號來降低你表面上的罕見程度——同時可能在另一項指標上看起來像連貫性失敗,因為隨機化本身就會變成一種可被偵測的模式。任何改動都應該分別針對這兩項指標各自評估。
為什麼沒有任何指紋測試能抓出時區對不上的 VPN?
因為這項檢查需要把你瀏覽器回報的時區,拿去跟伺服器實際看到你這條連線來自哪個 IP 做比對——而沒有任何瀏覽器 API 會把後者交給頁面自身的 JavaScript。這需要一次伺服器端的觀測,這也是為什麼它由 VPN/代理檢測這類網路工具負責,而不是任何純靠瀏覽器屬性替你打分的測試做得到的。


