← 返回部落格

Canvas 指紋是甚麼?網站如何透過瀏覽器繪圖識別裝置

核心結論:Canvas 指紋來自一次真實的繪圖操作,結果由顯示卡、系統、字體和瀏覽器引擎共同決定;單一項目定不了身份,卻能在參數交叉驗證中暴露環境的真實底細。管理它抓好兩點:單一環境的讀數要穩定,環境之間要拉開差距。下文按原理、影響因素、識別界線、檢測、MostMate 兩檔設定的次序展開。

同一個網站,兩部裝置開啟,頁面裡同一幅由系統畫出來的圖,像素卻對不上。頁面沒有出錯,是裝置在繪圖環節留下了各自的特徵。網站把這份特徵收下、算成一個值,就成了 Canvas 指紋,即瀏覽器指紋裡區分度最高的一類參數。MostMate 是一款指紋瀏覽器,Canvas 正是它指紋設定裡的基礎參數之一,本文講解這項參數由生成到設定的完整流程。

網站怎樣用 Canvas 給裝置畫一張「簽名圖」

Canvas 指紋來自一次真實的繪圖操作:網站讓瀏覽器畫出指定內容,再把結果讀走、算成一個特徵值。繪圖用的是瀏覽器提供的 Canvas 繪圖介面,網頁遊戲、圖表、圖片編輯共用的就是這套 2D 畫布能力,介面細節見 MDN 的 Canvas API 文件。整個過程用戶完全感覺不到。拆開來是三步:

  1. 繪製:頁面腳本在畫布上畫出一段固定內容,常見的是幾行文字加幾何圖形和漸變色塊。
  2. 讀取:腳本用 toDataURL() 或 getImageData() 這類介面把畫布匯出成字串或像素陣列。
  3. 比對:匯出結果被算成雜湊值,與這個環境之前的記錄、或其他訊號的預期放在一起核對。
Canvas 指紋生成三步流程圖

為甚麼兩部裝置畫不出同一張圖

繪圖結果由整條渲染鏈路共同決定,任何一環不同,像素就會有差別。同一份指令發給兩部裝置,系統先決定用哪套字體、怎樣渲染文字邊緣,再由瀏覽器引擎執行繪製,最後落到顯示卡和驅動程式輸出。四個環節各管一段:

  • GPU 與驅動程式。同一份繪圖指令,不同顯示卡和驅動版本算出的像素有細微差別,這是結果差異的主要來源。
  • 操作系統與文字渲染。Windows、macOS、Linux 的渲染方式和抗鋸齒策略不同,畫同一行字,邊緣平滑程度就不一樣。
  • 字體環境。畫布上的文字要用本機字體渲染,裝了甚麼字體、哪個版本都會進入繪圖結果;字體清單的檢測邏輯在字體指紋是怎樣測出來的那篇拆解過,兩者共用同一個來源。
  • 瀏覽器引擎與版本。Chromium、Firefox、WebKit 的繪製實現各有出入,大版本更新也會帶來細節變化。
同一繪圖指令在不同裝置上的雜湊差異

四個環節合起來決定了 Canvas 的區分度:單項差異微小,壓成雜湊之後,不同裝置對不上的概率相當高。一張小圖的背後,是整部裝置的渲染鏈路在同時出鏡。

Canvas 指紋能識別到甚麼程度

Canvas 指紋是一類區分度較高的裝置特徵,但單獨定不了身份。它的界線有三條,先說清楚。

其一,雜湊值相同不能反推裝置相同:兩部渲染鏈路恰好一致的裝置可能得到同一個值,市面上的主流配置本來就大量重複。

其二,網站不會單獨靠它做判斷:Canvas 讀數會和 UA、螢幕、字體、語言一起交叉驗證,在這組參數裡充當那項「不易自報、只能現場測」的硬證據。

其三,它和 Cookie 不是同一套機制:Cookie 儲存在本機、可以清除拒絕,Canvas 是存取時現場算的,清 Cookie 對它沒有影響。

三條界線合成一個判斷:Canvas 決定不了帳戶的命運,但同一批環境若雜湊完全一致,在交叉驗證裡等於自己舉手。

三步查看你環境的 Canvas 指紋

檢測 Canvas 不用裝工具,一個檢測頁加兩次複測就夠。按這個次序做:

  1. 記下當前讀數。在環境裡開啟 BrowserLeaks 的 Canvas 檢測頁,頁面會給出當前環境的雜湊值和圖像預覽,把它記下來。
  2. 同環境複測。關閉頁面重新開啟,或隔一兩天再測:同一環境的雜湊值應當不變。兩次對不上,說明有額外的處理在介入讀數。
  3. 跨環境對比。開第二個環境跑同樣的檢測,兩個雜湊應當有可見差異,差距越大,環境之間的區隔越清楚。

讀數看「穩不穩定、有沒有差異」,不用追求具體數值。不同檢測站的雜湊值可能對不上:各家畫的圖形、匯出方式、雜湊演算法都不一樣。跨站比較沒有意義,同一工具內的前後對比才有用。

BrowserLeaks Canvas 檢測頁

MostMate 裡 Canvas 兩檔怎樣選

MostMate 的指紋設定把 Canvas 收成真實、噪音兩檔(介面顯示 Real/Noise),預設取真實。產品全貌見MostMate 是甚麼;官網的手動指紋設定清單裡,Canvas 與音訊、WebGL 等參數並列,建立環境時在同一塊指紋設定區配置。兩檔差別先看對照:

維度真實噪音
讀數來源宿主機現場渲染,與手動開瀏覽器一致在真實渲染結果上疊加噪音
檢測表現反映宿主機真實渲染鏈路與宿主機脫開,按環境各自成值
適用場景人設與宿主系統地區一致的環境批量建環境、需要環境間拉開差距
注意點同機多環境預設讀數相同噪音幅度要控制在合理範圍內

真實檔適合宿主機「底子乾淨」的場合:本機是英文版 Windows、做的正是美國環境,用真實渲染,讀數與手動開瀏覽器一致,也沒有拼裝痕跡。限制同樣清楚:同機多環境都用真實檔,Canvas 讀數就是同一個值,環境之間沒有差異。

噪音檔補的就是這個缺口:在環境的 Canvas 讀數上疊加噪音,讓讀數與宿主機真實渲染脫開,批量建的環境彼此不同。前提是噪音受控,加完噪音的讀數仍要落在真實裝置的正常範圍內,不然這份「不同」本身就成了顯眼的異常;同一環境兩次讀數對不上也屬異常特徵,風險在為甚麼指紋隨機化反而危險那篇有完整論證。

Canvas 還要和同源參數一起核對。畫布渲染離不開操作系統、字體和顯示卡,這些參數應當指向同一套裝置畫像:選了 macOS 畫像,音訊、WebGL 圖像這些同組參數就要一併按 macOS 的合理範圍確認,只看 Canvas 一項容易漏掉組內錯位。音訊一項的檔位邏輯,AudioContext 指紋怎樣配那篇講過,思路可以照搬。

配置完成後做一輪驗證:在指紋設定裡確認 Canvas 檔位,右側指紋預覽面板的 Canvas 欄位會顯示 Noise[3LR450] 這樣的代號,它是這份噪音配置的標識,每個環境各有一份,和檢測頁算出的雜湊值是兩回事,別拿代號去對雜湊。實際讀數要開啟環境存取檢測頁查看,對照是否符合預期;之後每次換代理或調整指紋配置,都複測一遍再投入使用。

MostMate 建立環境表單的指紋設定區

常見問題

Canvas 指紋和瀏覽器指紋是同一回事嗎?

不是。瀏覽器指紋是幾十項參數組成的整體,Canvas 只是其中一項渲染類特徵,和 WebGL、字體清單同屬一類。總分是各項合起來的結果,Canvas 單項區分度高,不代表整個指紋就少見。

停用 Canvas 能防止被識別嗎?

不建議。Canvas 被大量網頁功能依賴,停用會影響正常使用;絕大多數正常瀏覽器都支援 Canvas,「不支援」反而成了少見特徵,更容易被挑出來。合理做法在於控制讀數的來源與一致性,關掉介面無補於事。

Canvas 指紋會隨瀏覽器更新變化嗎?

會,但節奏和隨機化完全不同。瀏覽器大版本更新帶來的渲染變化全網同步,所有用戶一起變,平台見過這種節奏。真實環境的 Canvas 值一年變幾次屬正常,頻繁且無規律的變化才異常。

指紋瀏覽器能讓每個環境的 Canvas 都不一樣嗎?

可以,噪音檔承擔的就是這個任務:在 Canvas 讀數上疊加噪音,讓批量環境的讀數彼此拉開。前提是噪音幅度合理,讀數仍要落在對應系統的正常範圍內。

結語

Canvas 指紋的本質,是裝置渲染鏈路在一張畫布上的集中出鏡:單項定不了身份,卻是最難自報、只能現場測的一項。管理上抓好兩點:單一環境讀數經得起複測,環境之間雜湊拉得開差距,同源參數指向同一套裝置畫像。想從零跑通一套環境,可以下載 MostMate,建好環境後把每個環境的 Canvas 讀數驗證一遍再投入使用。

MOSTMATE

安全管理多帳戶,輕鬆簡單

從首個帳戶開始,利用 MostMate 建立更安全、更智能、更高效的多帳戶營運方式。

  • 設定檔各自獨立,身分保持一致。
  • AI 自動化 · 帳戶健康 · 團隊營運
下載 MostMate