resistFingerprinting 偽裝時區、螢幕尺寸與字型,是 Firefox 與 Tor 的一致性反指紋防禦。
多數反指紋工具試圖讓裝置「每次看起來都不一樣」來隱藏你——一個全新的 Canvas 雜湊值、被打亂的字型清單、隨機的螢幕尺寸。Firefox 的 privacy.resistFingerprinting 偏好設定(在 Tor Browser 中始終開啟)走的卻是相反路線:它讓你的瀏覽器回報與所有其他開啟同一設定的使用者完全相同的一小組數值。本文將解釋這種「一致性」哲學在實務中代表什麼、RFP 具體偽裝了哪些內容、為什麼 Tor Browser 與 Firefox 共用同一套防禦引擎,以及它換來的代價是什麼。
關鍵要點
privacy.resistFingerprinting(RFP)是 Firefox 的一項偏好設定,在一般 Firefox 中預設關閉,但在 Tor Browser 中始終開啟,用來統一可被指紋辨識的瀏覽器特徵。- 它的設計目標是一致性,而非隨機化:讓每個開啟 RFP 的瀏覽器都回報相同的數值,使單一實例無法從人群中被區分出來。
- 它會將時區偽裝為 UTC、將視窗/螢幕尺寸取整到固定檔位(「letterboxing」加邊框)、在讀取 Canvas 前跳出提示、限制字型列舉,並凍結回報的作業系統/User-Agent 資訊。
- Tor Browser 與 Firefox 透過「Tor Uplift」專案共用同一套 RFP 程式碼——Tor 的反指紋研究成果最終以通用 Firefox 偏好設定的形式發布。
- 代價是真實存在的:RFP 會破壞依賴精確地理位置、原生視窗尺寸或 Canvas 元件的網站。它是一項粗暴但有效的工具,並不能無縫取代日常瀏覽體驗。
一致性哲學:融入人群,而非脫穎而出
Canvas 雜訊工具及類似擴充功能試圖透過讓每次讀取都「獨一無二」來對抗指紋辨識——每次都是全新的隨機值,使得無法計算出穩定的雜湊值。我們關於 Canvas 雜訊的文章 解釋了這種做法為何是個陷阱:任何指令碼能夠偵測到的隨機性(例如兩次讀取同一 Canvas 卻得到不同位元組)本身就會成為一種訊號——「這個瀏覽器正在執行隱私工具」這件事本身就具有辨識度,有時甚至比原始指紋更具辨識度。
Mozilla 的反指紋設計文件直接提出了另一種思路:與其試圖隱藏一個獨一無二的值,不如讓瀏覽器彼此無法區分。如果一千萬名 Tor Browser 使用者都回報相同的時區、相同的取整視窗尺寸、相同的字型清單,那麼單筆回報資料就不攜帶任何能把某位使用者從其他人中區分出來的資訊。匿名性來自人群的規模,而非來自隱藏本身。關於該專案自身對這項目標的闡述,可參見 Mozilla 的 Security/Fingerprinting 維基頁面;關於指紋辨識作為一種追蹤技術本身的定義,可參見 MDN 的 Fingerprinting 術語條目。
這種做法只有在共享同一數值的人群夠龐大時才有效。如果只有少數使用者擁有相同的一致性數值,那反而更接近一種指紋,而非防禦——這正是 RFP 以嚴格、狹窄的偽裝方式發布,而不是做成可自訂選項的原因:使用者能調整的任何選項,都會把整個人群重新拆分成可區分的小群體。
RFP 具體偽裝了什麼
RFP 涉及一長串 API,其中影響最大的包括:
時區 → UTC。 Intl.DateTimeFormat().resolvedOptions().timeZone 與 Date.prototype.getTimezoneOffset() 無論系統時鐘設定為何,都統一回報 UTC。直接從瀏覽器讀取時區的追蹤指令碼將完全得不到位置訊號——關於這項訊號通常如何被用來辨識 VPN 使用者,以及為什麼 RFP 選擇從源頭消除洩漏、而非讓偽造的時區與 VPN 出口國「看起來一致」,可參見《時區與語言洩漏》。
視窗與螢幕尺寸取整(「letterboxing」)。 RFP 不會回報你的精確可視區域尺寸,而是將 innerWidth/innerHeight 向下取整到最接近的檔位(預設為 200×100 像素的倍數),並用純色邊框填滿多餘空間。螢幕解析度(screen.width、screen.height)同樣會被限制為取整後的視窗尺寸,而非顯示器的真實解析度。這是最容易被察覺的 RFP 效果——當瀏覽器視窗沒有恰好落在某個檔位上時,你會在內容區域周圍看到灰色邊框。
Canvas 讀取權限提示。 RFP 不會完全封鎖 Canvas,也不會注入雜訊,而是在網站首次嘗試讀取 Canvas 像素時,以權限提示攔截 toDataURL() / getImageData() 呼叫。多數使用者預設會拒絕該提示,這會回傳一個空白 Canvas——在每個開啟 RFP 的瀏覽器上都視覺一致,既滿足了一致性目標,又避免了雜訊注入那種可被偵測的副作用。
受限的字型列舉。 RFP 不會暴露作業系統實際安裝的字型清單——這是一般指紋中資訊熵最高的訊號之一——而是將 document.fonts 與 CSS 字型比對限制在瀏覽器內建的一份固定白名單內,與系統實際安裝了什麼字型無關。
凍結的 User-Agent 與 navigator 屬性。 navigator.platform、navigator.oscpu、navigator.hardwareConcurrency 等欄位會被偽裝成一小組通用值(例如固定的 CPU 核心數),而非你的真實硬體規格;User-Agent 字串也會被統一為少數幾種常見變體,而非反映你確切的作業系統版本。
降低的計時精度。 高精度計時器 performance.now()(以及 Date.now() 的解析度)會被取整到更粗的時間間隔,藉此關閉了原本可被用來對硬體效能進行指紋辨識、或探測快取行為的計時側通道。
Tor Uplift:Firefox 與 Tor Browser 為何共用一套引擎
RFP 之所以存在於一般 Firefox 中,源自 Tor Uplift 專案——該專案致力於將 Tor Browser 的反指紋防禦從一個 Tor 專屬分支中抽離出來,以標準、持續有人維護的 Firefox 偏好設定形式發布。Tor Browser 建構於 Firefox ESR 之上,並預設開啟 privacy.resistFingerprinting;一般 Firefox 內建了同一套程式碼,但預設將其關閉,因為下文所述的代價對日常瀏覽而言被認為過於擾人。
共用同一套引擎帶來的實際好處是:與反指紋防禦相關的錯誤只需在單一程式碼庫中修復一次,兩款瀏覽器都能受益。這也代表,任何對 Tor Browser 的反指紋行為感到好奇的人,都可以在一般 Firefox 中透過 about:config 開啟同一個偏好設定,體驗完全相同的機制——這有助於在全面切換到 Tor Browser 進行日常瀏覽之前,先了解其中的取捨。
代價:會破壞哪些體驗
一致性是一項粗暴的工具,RFP 確實會破壞一些體驗:
- 依賴地理位置的網站(天氣、當地搜尋結果、與時區相關的行程安排)看到的是 UTC 而非你的真實時區,其行為就像你身處某個任意地點一樣。
- 基於 Canvas 的介面——部分驗證碼、繪圖工具與資料視覺化元件——不是每次載入都跳出權限提示,就是在你拒絕後渲染成空白。
- 視窗尺寸顯得不夠精確。 Letterboxing 意味著內容區域不會精確填滿視窗,部分使用者會覺得這在視覺上有干擾感,尤其是在視窗尺寸比較特殊的情況下。
- 少數網站會出現異常,當它們收到一個通用的 User-Agent 或一個被取整過的硬體並行數值、而這與其預期不符時,尤其是那些進行激進瀏覽器嗅探的老舊網站。
這些都不是錯誤——而是一致性策略本身直接帶來的代價。按照 RFP 自身的邏輯,一種只有在「不可見」時才有效的防禦,本身也算不上多可靠的防禦。
如何驗證 RFP 是否生效
如果你在 Firefox 中開啟 privacy.resistFingerprinting(about:config → 搜尋該偏好設定 → 設為 true),或改用 Tor Browser,你可以直接檢驗其效果,而不必只憑字面描述來相信它。在開啟前後分別執行一次 BrowserInsight 指紋檢測:開啟 RFP 後,你應該會看到回報的時區變為 UTC、Canvas 雜湊值變為空白或觸發權限提示、字型清單縮減為內建白名單,並且視窗/螢幕尺寸落在某個取整檔位上,而非你顯示器的原生解析度。比較這兩次結果,是最快感受一致性效果的方式,而不只是抽象地閱讀文字描述。
常見問題
resistFingerprinting 能讓我做到匿名嗎?
沒有任何單一設定能讓你做到匿名。RFP 降低了你瀏覽器本身的訊號在其他 RFP 使用者中的區分度,但你的 IP 位址、帳號登入狀態與瀏覽行為是另外獨立的追蹤途徑,RFP 並不涉及這些方面。Tor Browser 之所以將 RFP 與 Tor 網路搭配使用,正是為了同時匿名化你的 IP 位址;若僅在一般 Firefox 中單獨使用 RFP,你的網路層身分依然可見。
我該在一般 Firefox 中開啟 privacy.resistFingerprinting 嗎?
這取決於你的威脅模型。RFP 確實能顯著降低指紋的獨特性,但 letterboxing、時區偽裝與字型限制在日常使用中會相當明顯,並且會破壞部分網站的功能。多數只想獲得部分效益、又不想承受太多干擾的使用者,會選擇 Firefox 內建、較輕量的加強型追蹤保護,把完整的 RFP 或 Tor Browser 留給敏感度更高的瀏覽情境。
為什麼 Tor Browser 的內容周圍會出現一圈灰色邊框?
這就是 letterboxing 效果。RFP 會將你視窗回報的尺寸取整到一個固定檔位,並用純色邊框填滿剩餘空間,這樣你實際的視窗尺寸就不會作為一個獨一無二的值被洩漏出去。這是預期行為,不是渲染方面的錯誤。
RFP 能完全阻止 Canvas 指紋辨識嗎?
就 Canvas 而言,實際效果上可以:預設的「先提示後拒絕」行為會回傳一個空白 Canvas,在每個開啟 RFP 的瀏覽器上都完全一致,滿足了一致性目標。這與 Brave 的 farbling 等基於雜訊的防禦機制走的是不同路線——兩種方式的比較可參見我們關於 Canvas 雜訊的深度解析。


