Canvas 指紋利用同一段繪圖指令在不同軟硬體上的渲染差異形成識別標記,而且很少單獨使用。合理的因應方式不是追求每次都變,而是讓同一環境內的各項特徵彼此一致。
Canvas 指紋的原理並不複雜,但圍繞它流傳的因應方法中,有不少做法其實正好反了。
同一段指令,不同機器會畫出不同結果
Canvas 是 HTML5 提供的繪圖元件,網頁可以透過腳本在上面繪製圖形與文字。同樣的繪圖指令,在不同裝置上渲染出的結果會有細微差異,來源包括作業系統、瀏覽器版本、字型庫、顯示卡驅動程式等底層差異。肉眼幾乎看不出來,但把畫布內容匯出成一串資料後,這些差異就會變成可以比較的值。
流程大致如下:網頁先畫出一段圖形與文字,再使用 toDataURL() 將結果匯出成 Base64 字串,接著把這個字串當成識別標記使用。不同裝置的匯出結果不同,因此多數情況下它具有唯一性。清除 Cookie 不會影響它,清除快取也不會。
它很少單獨使用
單獨一個 Canvas 值能做的事有限,而且會隨瀏覽器升級或驅動程式更新而產生漂移。實際使用時,Canvas 通常會與一批特徵打包在一起進行交叉驗證:
- 圖形相關的 WebGL、字型清單、顯示卡型號
- 環境相關的 UA、時區、語言、螢幕解析度
- 工作階段相關的 Cookie、本機儲存空間、網路出口
把這些特徵打包的原因是要檢查一致性。每一項單獨看都可能落在正常範圍內,但組合後如果彼此矛盾就會非常顯眼:時區設在美國、語言清單全是中文、Canvas 值對應的是內建顯示晶片,但 UA 回報的卻是新款高階裝置。平台不需要證明你是誰,它只需要找出這一組特徵不像一台真實機器。
停用反而會把自己挑出來
很多人的第一個反應是把 Canvas 關掉,但結果往往正好相反。
一般使用者的瀏覽器幾乎都支援 Canvas。一個明確不支援 Canvas 的環境在統計上屬於少數,等於主動暴露自己做過特殊處理。更實際的問題是,不少網站的圖片裁切、圖表與 CAPTCHA 渲染都依賴 Canvas,關掉後頁面功能可能出錯,又多出一項異常。
還有一種做法是每次造訪都換一組隨機值。這個方向同樣有問題:真實裝置的指紋通常是穩定的,一個每次都在變的環境,行為模式不像一般裝置,反而更容易被單獨辨識與標記。隨機化本身就是一種可被識別的訊號。
合理的方向是內部自洽
比起每次都不一樣,更接近真實情況的目標,是讓環境內部各項特徵彼此一致,整體看起來也不異常。
落實到操作上,就是讓各項特徵互相支持:時區、語言與出口 IP 的地理位置要能對得上,UA 宣告的裝置與 Canvas、WebGL 表現出的圖形能力也應位於相近層級。同一個帳號的環境應長期保持穩定,重複造訪時不該出現明顯變化。不要依賴只會關閉某個功能的外掛,因為它們往往會帶來更明顯的特徵。能少執行的第三方腳本就盡量少執行,以縮小被蒐集的範圍。
如果幾組環境之間需要彼此區分,那是環境隔離要解決的問題。像 PurpleMark 這類工具在進行多帳號環境隔離時,通常會為每個帳號配置一套固定環境,而不是讓參數隨機跳動,因為平台端真正關注的是這組特徵是否穩定、彼此是否說得通。
小結
Canvas 能用來追蹤,是因為它把軟硬體的細微差異轉成一串穩定、可比較的數值。有效的因應不是把它關掉,也不是讓它不斷亂跳,而是讓它與同一環境中的其他特徵說同一個故事。看起來普通,比看起來特殊更安全。


