Canvas fingerprinting là một trong những kỹ thuật theo dõi mạnh nhất. Tìm hiểu cách nó hoạt động và cách giảm rủi ro bị theo dõi.
Canvas fingerprinting hoạt động bằng cách yêu cầu trình duyệt của bạn vẽ chữ và hình khối lên một canvas HTML5 vô hình, rồi đọc ngược lại các điểm ảnh kết quả và băm chúng thành một mã định danh ngắn, ổn định. Vì mỗi thiết bị kết xuất cùng những lệnh vẽ đó theo cách hơi khác nhau — tùy thuộc vào GPU, driver đồ họa, hệ điều hành và bộ máy phông chữ — nên giá trị băm trở thành một chữ ký âm thầm đi theo bạn qua các trang web mà không cần bất kỳ cookie nào. Bài viết này đi xa hơn nhiều so với những điều cơ bản: các điểm ảnh thực sự khác biệt ra sao, canvas bổ sung bao nhiêu tính độc nhất, làm sao biết khi nào một trang web đang lấy dấu vân tay bạn, và vì sao một số biện pháp phòng vệ phổ biến lại có thể phản tác dụng.
Canvas Fingerprinting thực sự hoạt động như thế nào
Kỹ thuật này dựa vào phần tử <canvas>, vốn dùng để vẽ đồ họa bằng JavaScript. Một script theo dõi không bao giờ cần hiển thị canvas đó lên màn hình — nó tồn tại hoàn toàn trong bộ nhớ.
Quy trình gần như nhất quán trong hầu hết mọi triển khai:
- Tạo một canvas ngoài màn hình. Một canvas nhỏ (thường rộng 200–300 px) được tạo nhưng không bao giờ gắn hiển thị lên trang.
- Vẽ một cảnh cố định. Script kết xuất một chuỗi văn bản định sẵn — thường pha trộn nhiều phông chữ, màu sắc, một hai emoji và các hình chữ nhật chồng lên nhau. Emoji và Unicode bất thường được ưa dùng vì chúng buộc ngăn xếp phông chữ của hệ điều hành phải đưa ra quyết định kết xuất.
- Đọc ngược các điểm ảnh. Script gọi
toDataURL()để xuất canvas thành PNG Base64, hoặcgetImageData()để đọc mảng byte RGBA thô. - Băm kết quả. Các byte đó được chạy qua một hàm băm (thường là kiểu FNV hoặc MurmurHash) để tạo ra một dấu vân tay gọn như
e3b0c44298fc1c14.
Điều khéo léo là các lệnh giống hệt nhau với tất cả mọi người, nhưng kết quả đầu ra thì không. Hai khách truy cập chạy cùng một script có thể tạo ra các giá trị băm khác nhau, còn cùng một khách truy cập lại tạo ra cùng một giá trị băm mỗi lần quay lại — đây chính xác là điều một kẻ theo dõi mong muốn.
Canvas không bao giờ được hiển thị. Bạn sẽ không thấy một cái nhấp nháy, một khung hình, hay bất kỳ dấu hiệu trực quan nào. Chính sự vô hình này là lý do canvas fingerprinting trở nên phổ biến đến vậy trong việc theo dõi thầm lặng.
Vì sao các điểm ảnh khác nhau giữa các thiết bị
Nếu việc vẽ chữ "Hello" lẽ ra phải xác định, vậy tại sao các byte lại thay đổi? Nhiều tầng trong hệ thống của bạn, mỗi tầng đều đưa vào những biến thể nhỏ nhưng có thể tái lập.
GPU và driver đồ họa
Khử răng cưa, kết xuất tiểu điểm ảnh và cách tô đầy các đường cong đều được giao một phần cho GPU. Một chip tích hợp Intel, một GPU Apple Silicon và một card rời NVIDIA sẽ làm tròn các điểm ảnh ở rìa theo những cách khác nhau. Ngay cả hai máy có cùng mẫu GPU vẫn có thể khác biệt nếu phiên bản driver của chúng khác nhau.
Rasterize phông chữ
Yếu tố đóng góp lớn nhất chính là việc kết xuất văn bản. Bộ máy phông chữ của hệ điều hành — DirectWrite trên Windows, Core Text trên macOS, FreeType trên Linux — quyết định cách biến đường viền glyph thành điểm ảnh. Hinting, hiệu chỉnh gamma và thuật toán khử răng cưa cụ thể thay đổi theo nền tảng và phiên bản, nên các điểm ảnh xám dọc theo rìa chữ "g" mang một lượng thông tin phân biệt đáng ngạc nhiên.
Hệ điều hành và phông chữ đã cài
Việc một phông chữ được yêu cầu có tồn tại hay không quyết định liệu trình duyệt có thay thế bằng phông dự phòng. Một emoji có thể được kết xuất thành đường viền phẳng trên hệ thống này và thành glyph đầy màu sắc trên hệ thống khác. Bộ emoji màu của hệ điều hành (Apple, Noto, Segoe) để lại một dấu vết đặc biệt mạnh.
Bộ máy trình duyệt và phiên bản
Chromium, Firefox và WebKit mỗi cái đều có triển khai canvas riêng. Quản lý màu và cách toDataURL() mã hóa dữ liệu PNG có thể thay đổi giữa các phiên bản trình duyệt, đó là lý do một bản cập nhật trình duyệt đôi khi làm thay đổi giá trị băm canvas của bạn.
Canvas bổ sung bao nhiêu tính độc nhất?
Canvas có giá trị với kẻ theo dõi không phải vì nó nhận diện riêng bạn, mà vì nó đóng góp một phần đáng kể entropy — thước đo mức độ một tín hiệu thu hẹp việc bạn là ai. Trong các nghiên cứu về fingerprinting trong thực tế, canvas đã nhiều lần được xếp vào nhóm tín hiệu đơn lẻ có entropy cao nhất mà một trang web thụ động có thể đọc được, ngang với toàn bộ danh sách phông chữ đã cài.
Tuy vậy, canvas hiếm khi nhận diện một người chỉ bằng chính nó. Nhiều người dùng chia sẻ các cấu hình phổ biến — một chiếc laptop Windows nguyên bản chạy Chrome với phông chữ mặc định sẽ trùng với hàng triệu người khác. Sức mạnh thực sự của nó xuất hiện khi kết hợp: canvas cộng với WebGL, thông số màn hình, múi giờ và ngôn ngữ cùng nhau đẩy về một dấu vân tay gần như độc nhất. Để có bức tranh đầy đủ hơn về cách các tín hiệu này chồng lớp, xem hướng dẫn toàn diện về fingerprinting trình duyệt của chúng tôi.
| Thuộc tính | Canvas Fingerprinting |
|---|---|
| Cần lưu trữ | Không (không cookie, không localStorage) |
| Sống sót qua việc xóa cache/cookie | Có |
| Sống sót qua chế độ ẩn danh/riêng tư | Thường là có |
| Người dùng nhìn thấy | Không |
| Mức đóng góp entropy điển hình | Cao trong các tín hiệu thụ động đơn lẻ |
| Bị vô hiệu khi xóa dữ liệu | Không |
| Bị vô hiệu khi đổi IP | Không |
Cách website sử dụng dấu vân tay Canvas
Canvas fingerprinting là con dao hai lưỡi. Cùng một cơ chế phục vụ cả mục đích xâm phạm lẫn bảo vệ:
- Theo dõi xuyên trang. Các mạng quảng cáo và phân tích nhúng trên nhiều trang đọc giá trị băm canvas để nhận ra một khách quay lại ngay cả sau khi đã xóa cookie, từ đó xây dựng hồ sơ hành vi.
- Chống gian lận và bảo mật tài khoản. Ngân hàng và đơn vị xử lý thanh toán đánh dấu các lần đăng nhập có dấu vân tay canvas đột nhiên khác với thiết bị đã biết, giúp phát hiện việc chiếm đoạt tài khoản.
- Phát hiện bot và lạm dụng. Trình duyệt headless và các framework tự động hóa thường tạo ra kết quả canvas hoặc quá đồng nhất hoặc kết xuất theo những cách dễ nhận biết, nên fingerprinting giúp tách người dùng thật khỏi lưu lượng do script tạo ra — xem Các kỹ thuật phát hiện bot để biết cách điều này hoạt động trong thực tế.
- Giới hạn tần suất và ngăn lạm dụng. Các dịch vụ dùng dấu vân tay làm khóa ổn định để chặn các tài khoản né giới hạn bằng cookie mới.
Cách phát hiện liệu bạn có đang bị lấy dấu vân tay Canvas
Bạn không thể thấy canvas, nhưng có thể để ý những hành vi đi kèm với nó.
Theo dõi các lệnh gọi API
Trong một nỗ lực lấy dấu vân tay, JavaScript gọi getContext('2d'), rồi fillText(), rồi toDataURL() hoặc getImageData() trên một canvas không bao giờ được thêm vào trang hiển thị. Công cụ dành cho nhà phát triển của trình duyệt và một số tiện ích mở rộng về quyền riêng tư có thể làm lộ những lệnh gọi này.
Một móc phát hiện tối giản
Bạn có thể tự gắn đo canvas API để ghi lại các lần đọc đáng ngờ:
// Phát hiện các script đọc điểm ảnh canvas mà không hiển thị gì
(function watchCanvasReads() {
const origToDataURL = HTMLCanvasElement.prototype.toDataURL;
const origGetImageData = CanvasRenderingContext2D.prototype.getImageData;
HTMLCanvasElement.prototype.toDataURL = function (...args) {
if (!document.body.contains(this)) {
console.warn('[canvas-fp] toDataURL() on an off-screen canvas', this);
}
return origToDataURL.apply(this, args);
};
CanvasRenderingContext2D.prototype.getImageData = function (...args) {
console.warn('[canvas-fp] getImageData() reading pixels back', this.canvas);
return origGetImageData.apply(this, args);
};
})();
Nếu bạn muốn xem chính dấu vân tay của mình thay vì đọc code, cách đơn giản nhất là chạy công cụ phát hiện dấu vân tay của BrowserInsight. Nó tính giá trị băm canvas trực tiếp của bạn, hiển thị các tín hiệu WebGL và âm thanh bên cạnh, và ước tính dấu vân tay tổng thể của bạn độc nhất đến mức nào.
Các biện pháp phòng vệ và sự đánh đổi của chúng
Không có biện pháp phòng vệ hoàn hảo duy nhất nào, và — điều quan trọng — một số lựa chọn phổ biến lại có thể khiến bạn dễ nhận diện hơn. Sau đây là cách so sánh các hướng tiếp cận chính.
Đồng nhất (cách tiếp cận của Tor Browser)
Chiến lược của Tor Browser là làm cho mọi người dùng trông giống hệt nhau. Nó vô hiệu việc đọc ngược canvas theo mặc định và hỏi xác nhận trước khi cho phép, nên một script hoặc nhận được kết quả rỗng hoặc một giá trị mà cả cộng đồng Tor chia sẻ. Hòa lẫn vào một đám đông lớn và đồng nhất là biện pháp phòng vệ vững chắc nhất — nhưng cái giá phải trả là một trải nghiệm duyệt web bị chuẩn hóa nặng nề, đôi khi hạn chế.
Ngẫu nhiên hóa (farbling của Brave)
Brave đi theo một con đường khác gọi là farbling: nó thêm nhiễu nhỏ, theo từng phiên và từng tên miền, vào việc đọc ngược canvas để dấu vân tay của bạn thay đổi trên mỗi trang và mỗi phiên. Điều này phá vỡ hiệu quả việc liên kết xuyên trang. Rủi ro tinh tế là bản thân việc bị ngẫu nhiên hóa lại có thể bị phát hiện — và ngẫu nhiên hóa triển khai ngây thơ có thể nghịch lý thay thêm vào entropy, vì "một trình duyệt có canvas nhiễu" tự nó là một đặc điểm phân biệt. Farbling được thiết kế tốt giữ cho nhiễu nhỏ và hợp lý để tránh cái bẫy này. Để tìm hiểu sâu hơn về cách thiết kế noise quyết định liệu ngẫu nhiên hóa có giúp ích hay phản tác dụng, xem Canvas Noise vs Hash Thật: Vì Sao Randomization Phản Tác Dụng.
Tiện ích chặn (CanvasBlocker)
Các tiện ích như CanvasBlocker có thể chặn việc đọc ngược, trả về một giá trị giả, hoặc ngẫu nhiên hóa theo từng tên miền. Chúng cho bạn quyền kiểm soát tinh tế, nhưng cùng một lưu ý áp dụng: một giá trị giả mạo bất thường hoặc quá hung hăng có thể nổi bật, và một bộ chặn cấu hình kém có thể là một tín hiệu mạnh hơn cả cái canvas mà nó che giấu.
Tắt JavaScript
Tắt JavaScript (qua NoScript hoặc tương tự) vô hiệu hoàn toàn canvas fingerprinting, vì API không thể chạy. Sự đánh đổi rất lớn — hầu hết website hiện đại sẽ hỏng nếu thiếu nó — nên cách này chỉ phù hợp với những quy trình nhạy cảm nhất về bảo mật.
| Biện pháp | Cách hoạt động | Đánh đổi chính |
|---|---|---|
| Đồng nhất của Tor Browser | Mọi người trông giống nhau | Trải nghiệm bị hạn chế, chuẩn hóa |
| Farbling của Brave | Nhiễu theo phiên phá vỡ liên kết | Ngẫu nhiên hóa có thể bị phát hiện |
| CanvasBlocker | Chặn/giả mạo/ngẫu nhiên hóa việc đọc ngược | Cấu hình sai có thể phản tác dụng |
| Tắt JavaScript | API không bao giờ chạy | Làm hỏng hầu hết website |
Câu hỏi thường gặp
Xóa cookie có loại bỏ dấu vân tay canvas của tôi không?
Không. Canvas fingerprinting không lưu gì trên thiết bị của bạn — nó suy ra mã định danh từ cách phần cứng và phần mềm của bạn kết xuất đồ họa. Xóa cookie, cache hay dữ liệu trang không có tác dụng gì với nó.
Chế độ riêng tư hay ẩn danh có chặn được canvas fingerprinting không?
Thường là không. Cửa sổ riêng tư cô lập cookie và lịch sử, nhưng GPU, driver và phông chữ của bạn không đổi, nên giá trị băm canvas thường giống như ở cửa sổ bình thường. Chế độ riêng tư giúp ích cho việc theo dõi dựa trên lưu trữ, chứ không phải fingerprinting.
Một website có thể thấy tôi đang dùng bộ chặn canvas không?
Đôi khi có. Nếu canvas của bạn trả về một giá trị giả mạo, rỗng hoặc nhiễu một cách rõ ràng, một script tinh vi có thể suy ra rằng một biện pháp bảo vệ đang hoạt động. Đó là lý do tại sao tính đồng nhất (trông giống mọi người) thường vững chắc hơn ngẫu nhiên hóa (trông khác biệt một cách cố ý).
Canvas fingerprinting có giống với WebGL fingerprinting không?
Chúng có liên quan nhưng khác biệt. Canvas đọc việc kết xuất 2D của chữ và hình khối; WebGL dò GPU của bạn qua kết xuất 3D và lộ trực tiếp các chuỗi vendor và renderer. Chúng bổ sung cho nhau trong một dấu vân tay kết hợp — bài phân tích sâu về WebGL fingerprinting của chúng tôi trình bày chi tiết về phía 3D.


