了解瀏覽器指紋如何透過 Canvas、WebGL、字型與音訊訊號識別你,並學習用 BrowserInsight 檢測、降低指紋追蹤,切實保護你的線上隱私。
什麼是瀏覽器指紋?
瀏覽器指紋(Browser Fingerprinting)是一種透過收集瀏覽器與裝置特徵來識別、追蹤使用者的技術,而不是在裝置上儲存任何識別碼。W3C 官方的指紋識別指引劃出了一條標準組織判斷「該不該管」時會用到的界線:被動指紋讀取的是瀏覽器自動暴露的資訊,例如標頭與螢幕尺寸;主動指紋則需要指令碼主動去探測某個 API——Canvas、WebGL、AudioContext——並觀察它的反應。(更簡短的定義可參見 MDN 的指紋術語條目。)這條界線之所以重要,是因為它決定了瀏覽器廠商能把哪些訊號擋在權限提示之後,又有哪些訊號是平台預設行為的一部分、天生就暴露在外。與傳統的 Cookie 不同,瀏覽器指紋不需要在使用者的裝置上儲存任何資料,因此即使使用者清除了瀏覽器資料,網站仍然可以透過指紋資訊識別出同一位使用者——參見持久訪客 ID:無痕、VPN、清快取都殺不死它,了解為什麼清除 Cookie、切換無痕模式或更換 VPN 都無法重置這種方式建構的 ID。
瀏覽器指紋的運作原理
當你造訪一個網站時,你的瀏覽器會自動向伺服器傳送大量資訊,包括:
- User-Agent:瀏覽器類型、版本、作業系統資訊
- 螢幕解析度:顯示器的大小與色彩深度
- 時區:裝置的本地時間設定
- 已安裝字型:系統中可用的字型清單
- Canvas 指紋:透過 HTML5 Canvas 繪製的圖形在不同裝置上的細微差異
- WebGL 指紋:顯示卡與圖形驅動程式的資訊
- 音訊指紋:音訊處理器的特徵
- 版面配置幾何資訊:頁面元素與文字位置的次像素級量測,透過普通 DOM 版面配置 API 讀取——參見 ClientRects 指紋
- 媒體裝置:透過
enumerateDevices()讀取的攝影機、麥克風數量、ID,以及取得權限後的型號標籤——參見媒體裝置指紋 - 已安裝語音:透過
speechSynthesis.getVoices()揭露的文字轉語音清單,無需任何權限提示——參見語音合成指紋 - CSS 媒體查詢:
prefers-color-scheme等偏好、硬體訊號與已安裝字型,完全不需要任何 JavaScript 就能洩漏——參見 CSS 指紋技術 - 權限狀態:
navigator.permissions.query()辨識哪些權限名稱、每種解析為granted/denied/prompt,全程不跳窗——參見Permissions API 指紋 - 外掛清單:
navigator.plugins如今已被規範寫死成兩種固定狀態之一,但與navigator.pdfViewerEnabled或聲稱的瀏覽器身分對不上,依然會洩露自動化與竄改——參見navigator.plugins 指紋 - 網路資訊:透過
navigator.connection讀取的粗略連線狀態(effectiveType、downlink、rtt),僅 Chromium 可用——參見Network Information API 指紋 - 鍵盤配置:透過
navigator.keyboard.getLayoutMap()讀取的作業系統鍵盤實體配置,僅 Chromium 可用——參見鍵盤配置指紋 - 電池狀態:曾可無權限提示讀取的電量與充放電時間估算——Firefox、Safari 在再識別研究曝光後相繼放棄支援;參見Battery Status API
- HTTP 請求標頭:
Accept、Accept-Language、Accept-Encoding標頭,早在任何一行 JavaScript 執行之前就已被讀取——參見無需 JavaScript 的指紋識別
針對瀏覽器指紋的研究發現,組合足夠多的這類特徵後,絕大多數瀏覽器都能被唯一識別。實際上,你的瀏覽器指紋可能幾乎和現實世界中的指紋一樣獨特。
每一項訊號單獨來看都很微弱——有許多人與你共用相同的螢幕解析度或時區。指紋技術之所以奏效,是因為這些數值大致上彼此獨立,組合起來便能讓獨特性倍增。用資訊理論的話來說,每一項屬性都會增添幾個位元的熵,而一旦合併後的熵超過約 33 個位元,這個瀏覽器在全世界所有人之中就幾乎是獨一無二的了——這個門檻最早由 EFF 的 Panopticlick 研究(Eckersley, 2010)大規模證實,後續研究如 Laperdrix et al. 也予以印證。光是 User-Agent、字型清單、Canvas 與 WebGL 這樣常見的組合,往往就足以跨過這道門檻。參見《瀏覽器指紋熵與匿名集詳解》,了解這些位元是如何加總的,以及由此產生的「1 比 N」匿名集究竟代表什麼意思。
WebRTC 是相關但獨立的另一種風險——而且有兩種不同的形式。 它最廣為人知的問題是一種網路洩漏,即使在 VPN 背後也可能暴露你的真實 IP 位址。關於如何檢測並封堵它,請參閱 WebRTC 洩漏防護。此外,WebRTC 還透過它所支援的編解碼器與 SDP 結構,暴露出另一個獨立的小型指紋面,與你的 IP 無關——參閱 WebRTC 指紋技術,了解這項訊號的原理,以及為什麼堵住洩漏並不能消除它。
這些訊號在不同裝置上的權重並不相同。量產的手機硬體會拉平 Canvas、WebGL 與字型的熵值,遠不如桌面 PC 組態那樣千差萬別——但螢幕幾何資訊、觸控點與動作感測器,又帶來了桌面裝置大多不具備的訊號。參見行動裝置瀏覽器指紋識別,了解 Android 與 iOS 裝置具體是如何被追蹤的。
時區與語系值得特別一提,因為它們不只是裝置訊號,同時也是地區訊號——想知道你的連線實際來自哪個國家的服務,可以把你回報的時區、語系拿來跟 IP 地理位置比對,而只改變 IP 的 VPN 會讓這種矛盾原形畢露。參見應用程式如何在 VPN 之下辨識你的真實地區,了解這項具體檢測機制的原理。
Canvas 指紋技術詳解
Canvas 指紋在隱藏的 <canvas> 元素上繪製文字與圖形,讀取算繪後的像素並計算雜湊——不同裝置的 GPU、驅動程式與算繪引擎的細微差異,會讓完全相同的繪製程式碼產生不同的雜湊值。它至今仍是使用最廣泛的指紋訊號之一,因為它不需要任何權限提示,且只需幾毫秒即可完成。關於能最大化熵值的具體繪製操作、實際範例程式碼,以及如何解讀自己的 Canvas 雜湊,參見Canvas 指紋檢測:網站如何識別你的裝置。
WebGL 指紋技術
WebGL 指紋從你的 GPU 讀取兩種不同的東西:數十項回報的參數——包括藉由 WEBGL_debug_renderer_info 擴充功能取得的未經遮蔽 GPU 廠商與算繪器字串——以及一次離螢幕算繪測試場景後計算出的像素雜湊,它會隨驅動程式層級的浮點運算與抗鋸齒差異而變化。由於兩者都來自硬體與驅動程式,而非你能隨手切換的設定,WebGL 是最難防範的黏著性訊號之一;算繪器字串甚至能揭露作業系統——舉例來說,Direct3D 後端權杖只可能來自 Windows——這正是為什麼某些 GPU/OS 組合不只是罕見,而是在物理上不可能存在,並會立即被標記。完整的 API 說明、範例程式碼與防護方案,請閱讀 WebGL 指紋深度剖析。
平台層級發生了什麼變化
指紋面並非一成不變——瀏覽器廠商多年來一直在收窄它,但走的是兩條截然不同的路線。你用的瀏覽器走哪一條,決定了指令碼還能從你這裡讀到什麼,因此值得先弄清楚自己站在哪一邊。
Chromium:削減被動暴露面,其餘的交給授權
User-Agent Reduction(UA 精簡) 把每次請求預設發送的 User-Agent 字串精簡成一個低細節的存根,凍結了次版本號,並移除了原本無需任何指令碼執行就能讀到的作業系統/裝置細節。具體哪些欄位被凍結,參見 Chrome 官方的 User-Agent Reduction 文件;對這些變化在偽裝偵測上的影響,參見我們對這項變化的詳細拆解。原本藏在被動 UA 字串裡的細節並沒有消失——它被搬到了 User-Agent Client Hints 背後,這是一個需要網站主動請求、而非自動收到的選擇性加入(opt-in)API。這也是 Chrome Privacy Sandbox 計畫的大方向:把指紋識別面當作需要主動抑制或用權限擋住的東西,而不是任其被動廣播。同樣要強調,這是 Chromium 的方向,並非整個 Web 的方向。
Firefox 與 Safari:擋掉指令碼,統一答案
Firefox 與 Safari 都沒有實作 User-Agent Client Hints,也都不認為「讓網站主動來要」就是解方。Mozilla 的思路是攔住採集方,而不是改造訊號本身:Firefox 的加強型追蹤保護(ETP)預設會封鎖已知指紋指令碼名單上的指令碼;而 privacy.resistFingerprinting 則留給那些想採用 Tor Browser 那套更嚴格做法——直接回傳統一數值——的使用者。Apple 把立場直接寫進了 WebKit 追蹤防護政策:該文件將指紋識別歸類為「無狀態追蹤」,承諾 WebKit 會盡力阻止一切隱蔽追蹤,並補充說,若某項技術無法被徹底阻止,WebKit 就會透過「減少可用的熵位元數」來限制它——正是上文那套位元計算,被寫成了廠商政策。
由此帶來的實際結果是:「我到底有多容易被辨識?」並沒有唯一答案,因為這個答案屬於某一個特定的瀏覽器,而不屬於你本人。這也正是為什麼它只能實測,不能靠猜。
如何解讀你自己的指紋
要理解自己的暴露程度,最好的方法就是看看你自己的指紋。BrowserInsight 的指紋檢測功能完全在你的瀏覽器中執行——絕不會將任何指紋資料傳送到伺服器(IP 查詢則由另一個獨立的工具處理)——並會向你展示:
- 你的 Canvas 與 WebGL 雜湊值,以及它們看起來是常見還是罕見
- 你完整的 WebGL 算繪器字串,以及它所揭露的 GPU
- 偵測到的音訊指紋特徵
- 追蹤者所能讀取的全部標頭與 JavaScript 暴露屬性
- 一個匿名性評分,估算你目前的設定有多獨特,並附上具體建議
先在你平常使用的瀏覽器中執行一次檢測,再在啟用隱私瀏覽器或擴充功能後執行一次,然後比較兩次的評分。這種前後對照是最快的方式,讓你看清楚哪些防護真正對你的裝置產生了實質影響——因為答案會因每台機器而異。若想用一套結構化、逐項核對的方式來做這個比較,可參見瀏覽器指紋一致性自查清單。
如何保護你的瀏覽器指紋
沒有任何單一開關能讓你變得匿名,而現有的防護手段遵循著兩種截然相反的理念:看起來和大家一樣(一致化)或每次都看起來不一樣(隨機化)。理解某個工具採用的是哪一種,能幫助你避免以適得其反的方式把它們混用。
1. 使用隱私保護瀏覽器
Tor 瀏覽器採取一致化的做法:它將螢幕尺寸、字型、Canvas 與 WebGL 輸出標準化,讓所有 Tor 使用者看起來幾乎一模一樣,把你放進一大群彼此相同的人當中,而不是任由你在人群中顯眼。Brave 採取隨機化的做法——它的「farbling」會在 Canvas、WebGL 與音訊讀數中注入微小的雜訊,並依每個網站、每個工作階段分別播種,因此每個網站看到的數值都不一樣,而這些數值也會在不同工作階段之間不斷變化。Firefox 則提供 privacy.resistFingerprinting(RFP),借用了 Tor 的一致化技術,並且在 Tor Browser 中預設就是開啟的。它們以不同的方式降低可被指紋識別的程度,但都具備一個關鍵共通點:改變高熵的算繪訊號——而這正是最關鍵之處。
2. 使用瀏覽器擴充功能
有一些瀏覽器擴充功能可以幫助抵禦指紋追蹤:
- CanvasBlocker:阻擋或偽裝 Canvas 指紋
- Privacy Badger:自動阻擋追蹤器
- uBlock Origin:阻擋廣告與追蹤指令碼
不過要謹慎挑選:擴充功能會以廣泛的權限存取你造訪的每一個頁面,一個粗心或惡意的擴充功能本身就可能變成追蹤管道。在安裝任何新擴充功能之前,請先參閱瀏覽器擴充功能的隱私風險。
3. 停用 JavaScript
停用 JavaScript 能一次拿掉全部主動訊號——Canvas、WebGL、音訊與字型探測都得靠指令碼才跑得起來——代價是大量網頁功能隨之失效。你可以使用 NoScript 等擴充功能,按網站逐一放行。但要注意它管不到什麼:被動那一層原封不動。你的 HTTP 請求標頭早在任何一行指令碼執行之前就被讀走,而光靠 CSS 依然會洩漏偏好設定、硬體特徵與已安裝字型。關掉 JavaScript 只是縮小了你的指紋,並不能把它抹掉。
4. 使用獨立的虛擬機器
虛擬機器改變的是那些最強訊號真正的來源層:不同的客體作業系統、GPU 驅動程式堆疊、字型集合與螢幕幾何,會產生貨真價實不同的 Canvas 雜湊與 WebGL 算繪器字串,因此不同虛擬機器裡的活動很難被關聯在一起。
瀏覽器容器與多份瀏覽器設定檔在這裡常被誤解:它們隔離的是儲存空間——Cookie、localStorage、網站資料——這對以 Cookie 為基礎的追蹤確實是有效防護,但對指紋毫無作用。你的 GPU、字型、螢幕與時區在每個容器裡都完全相同,因此指紋指令碼在所有容器中看到的都是同一台裝置。容器是用來隔開登入狀態的,不是用來隔開身分的。
反指紋的悖論
有一個值得理解的陷阱:一項罕見或過度客製化的防護,可能讓你更容易被辨識,而非更難。如果你是唯一一個執行某款特定偽裝擴充功能、又搭配不尋常 User-Agent 的訪客,那麼這個組合本身反而成了一個獨特的指紋——這正是 EFF 的 Cover Your Tracks 工具所揭示的同一種取捨:隱私擴充功能有時反而會讓唯一性評分變差而非變好;原因與該評分究竟衡量什麼,參見Cover Your Tracks 唯一性分數說明不了什麼。這正是為什麼像 Tor 和 Firefox RFP 這類一致化工具會試圖把你放進一個龐大且彼此相同的人群中,而不是讓你變得與眾不同——也是為什麼堆疊大量量身打造的調整,往往弊大於利。一般原則是:寧可選擇隱私瀏覽器那條久經考驗的預設組態,也不要自行拼湊一堆擴充功能。反偵測瀏覽器——整體替換指紋設定檔的工具——將這一悖論推向了極致:偽造的模式本身也會成為特徵,詳見網站如何偵測反偵測瀏覽器與指紋偽造。想了解偵測系統具體依賴哪些信號——TLS、Canvas 雜訊、字型、UA-CH 等——來分辨偽造設定檔與真實裝置,參見反偵測瀏覽器 vs 真實瀏覽器:偵測系統能看到的 12 個信號。
瀏覽器指紋的合法用途
雖然瀏覽器指紋常被用於廣告追蹤,但它也有合法的用途:
| 用途 | 說明 |
|---|---|
| 安全防護 | 檢測帳戶異常登入,防止詐騙 |
| 反爬蟲 | 識別與阻擋自動化程式 |
| 使用者體驗最佳化 | 根據裝置特性最佳化網頁顯示 |
| 版權保護 | 追蹤內容外洩來源 |
其中反爬蟲是技術上最複雜的一項——關於網站如何把自動化流量和真實訪客區分開來(往往正是運用這些相同的指紋訊號),請參閱機器人偵測技術。
常見問題
瀏覽器指紋和 Cookie 是同一回事嗎?
不是。Cookie 是儲存在你裝置上的小型檔案,你可以查看、封鎖或刪除它們。而指紋則是從你的瀏覽器與裝置特徵推導出來的——你這一端不會儲存任何東西,因此清除 Cookie 或換到一個全新的瀏覽器設定檔都無法重設它。這正是指紋比起以 Cookie 為基礎的追蹤更難擺脫的原因。另一種技術——彈跳追蹤——用完全不同的方式繞過 Cookie 封鎖:透過一次重新導向,讓追蹤者自家網域短暫變成第一方,全程不觸及你裝置的任何特徵。還有一種不靠 Cookie 的手法藏在 HTTP 快取本身裡:參見ETag 與快取超級Cookie,了解伺服器如何把普通的快取重新驗證變成一個追蹤識別碼。
無痕或隱私模式能阻止指紋採集嗎?
大致上不能。隱私模式會讓瀏覽器不在本機儲存歷史記錄、Cookie 和網站資料,但它並不會改變指紋所依據的那些特徵——你的螢幕尺寸、字型、Canvas 輸出和 GPU 在隱私視窗裡看起來都一模一樣。網站往往仍能跨越一般工作階段與隱私工作階段認出你。有些網站甚至能直接判斷出你正處於隱私視窗中——背後所利用的儲存 API 手法,可參考網站如何偵測無痕與隱私瀏覽模式。
瀏覽器指紋中哪一部分最具識別性?
這會因情況而異,但算繪類訊號——Canvas 與 WebGL——通常是最難改變的,因為它們源自你的 GPU 與驅動程式,而非某個你能隨手切換的設定。這也讓它們成為防護時最具價值的目標:阻擋或隨機化 Canvas 與 WebGL 的輸出,比起調整你的 User-Agent 或時區,能消除更多獨特性。BrowserInsight 會顯示哪些訊號對你自己瀏覽器的貢獻最大,讓你知道力氣該花在哪裡最值得。
VPN 能阻止瀏覽器指紋採集嗎?
不能。VPN 會改變你的 IP 位址和表面上的所在位置,但指紋是從你的瀏覽器與裝置運算出來的,而非你的網路——無論換到哪個 IP,你看起來都一模一樣。VPN 確實有助於解決以 IP 為基礎的追蹤和 WebRTC 洩漏這些另外的問題,但它對指紋本身毫無作用。還有一種值得了解的相關但不同的技術:TLS 指紋識別——它透過 TLS 握手而非瀏覽器 API 來識別你的客戶端軟體,同樣能穿透 VPN 隧道。
總結
瀏覽器指紋是一種強大而隱蔽的追蹤技術,它建立在你的瀏覽器與裝置特徵之上,而非任何儲存在裝置上的資料。了解它的運作原理——以及哪些訊號真正具有決定性——是掌控自身暴露程度的第一步。要在網際網路上做到完全匿名很難,但上述防護措施已經能讓你走得很遠,而哪一項真正發揮了作用,只有實測才知道。不妨從一次免費的指紋檢測開始——它完全在你的瀏覽器中執行,不會向伺服器傳送任何資料,幾秒鐘就能看到結果。
推薦閱讀:
- resistFingerprinting:Firefox 與 Tor 反指紋機制
- 指紋一致性:為何訊號矛盾會讓你被標記
- 行動裝置瀏覽器指紋識別:Android 與 iOS 如何被追蹤
- WebRTC 洩漏防護:VPN 使用者的必修課
- WebRTC 指紋技術:編解碼器與 SDP 如何暴露你的瀏覽器
- Canvas 指紋檢測:網站如何識別你的裝置
- 音訊指紋:AudioContext 如何識別你的裝置
- 彈跳追蹤解析:不靠 Cookie 也能追蹤的重新導向手法
- 字型指紋:已安裝字型如何暴露你
- 鍵盤配置指紋:getLayoutMap 訊號
- ClientRects 指紋:次像素版面配置如何成為識別碼
- 媒體裝置指紋:enumerateDevices 會洩露什麼
- 語音合成指紋:已安裝語音作為一種訊號
- CSS 指紋技術:無需 JavaScript 也能追蹤你
- Permissions API 指紋:權限狀態如何追蹤你
- Network Information API 指紋:downlink 與 RTT 會洩露什麼
- Battery Status API:一堂隱私警示課

