「Canvas API」的設計目的在於繪製網頁瀏覽器中的圖形。其應用範疇包括動畫、遊戲畫面、數據視覺化、圖片編輯以及實時視頻處理等,亦可透過瀏覽器指紋識別進行線上追蹤。此技術依賴於畫布圖像在不同網路瀏覽器和平台上的呈現方式變化,以創建用戶瀏覽器的個性化數字指紋。然而,在完全相同的設備環境下,其有可能產生重複。
Canvas 功能檢測
- Canvas 2D API
- Text API for Canvas
- Canvas toDataURL(常用於指紋識別)
- OffscreenCanvas API
- Canvas native
「Canvas」指紋亦可由瀏覽器插件進行修改,然而,其易被識別之特性仍然明顯。
- 穩定性
在同一台设備和瀏覽器環境下,canvas具有穩定性。
- 非人為噪音
部分指紋瀏覽器或指紋插件能於 canvas 雜訊中添加參數,然而仍可能被識別。
圖像細節
範例圖像 | |||
檔案大小 | 0 bytes | ||
色彩的數量 | 0 | ||
PNG 關鍵數據塊 | |||
資料塊名稱 | 長度 | CRC | 描述 |
Canvas 指紋產生的原因
Canvas 圖像在畫布上的展現方式可能會因網頁瀏覽器、操作系統、顯卡及其他因素而異,進而產生可供創建指紋的獨特圖像。
1. 抗鋸齒
抗鋸齒技術猶如美顏濾鏡,廣泛應用於各處。若作業系統未啟用字體平滑功能,部分字體在電腦顯示器上的呈現將相當糟糕。一般而言,Windows作業系統會預設開啟字體與圖像平滑。在Mac OS X中,抗鋸齒似乎只適用於特定大小以下的字體。不僅在作業系統層級,部分瀏覽器也會內建自家的抗鋸齒技術,如Safari使用自家的內建字體渲染引擎。然而最重要的是,抗鋸齒技術在Canvas上繪製字體與圖像時亦能發揮效用。
如下圖所示,左側為未啟用字體平滑的狀態,而右側則已啟用:
抗鋸齒技術將產生部分非純色像素,這些過渡狀態的像素值受顯卡色彩配置檔的影響,進而導致其色彩可能有所差異,我們稱之為噪音。在足夠大的畫布上,繪製相同的字體與圖像,再計算所有像素數據,便能獲得相對獨一無二的指紋數據。
2. 字體微調(Font Hinting)
微調的一個特性是網格配合,即透過調整字體字符的字高和字寬,使字符與螢幕顯示的設定像素網格對齊。圖像顯示到螢幕上是一個個小方塊網格,字體可能會左右移動以確保正確顯示在網格上,這樣也是為了在不同螢幕下字體形狀及排版看起來大致相同。
透過以下GIF圖像乃眾多不同用戶的畫布圖像之匯集,可直觀觀察,相同的程式碼在不同的設備環境下所展現的差異:
如上述圖像細節所示,一般來說,我們可以調用 toDataURL 函數獲取 Canvas 圖像的 base64 數據,亦可從 Canvas 生成的 PNG 圖像的數據塊中獲取 IDAT 塊的 CRC 校驗和。然後我們可以計算該字串(base64 或 CRC 校驗和)的雜湊值(具體算法因各網站而異)來作為 Canvas 指紋。
注意:Canvas 指紋在各個不同網站中的原因眾多,使用的字串不同(base64 或 CRC 校驗和),雜湊值算法不同(MD5, SHA, MUMUHASH, etc.)皆會使 Canvas 指紋截然不同,然而真實的 Canvas 指紋卻是穩定的,因此在相同的瀏覽器與設備環境下,同一網站的 Canvas 指紋是固定的。這也是 Canvas 指紋用於用戶輔助識別的理論基礎,其具有穩定性質。