Trình duyệt DuckDuckGo thêm nhiễu cho canvas và cố định vài giá trị phần cứng, nhưng không khiến bạn giống mọi người. Mã nguồn mở thay đổi gì và giữ nguyên gì.
Người mở trang kiểm tra dấu vân tay trong trình duyệt DuckDuckGo thường chỉ muốn biết một điều: dấu vân tay của tôi có được bảo vệ không? Câu trả lời ngắn gọn: trình duyệt làm giảm một số tín hiệu fingerprinting, nhưng không cố khiến mọi người dùng trông giống hệt nhau như Tor Browser. Cơ chế bảo vệ của nó pha trộn hai chiến lược, và cả hai đều thấy được trong mã nguồn mở.
Điểm Chính
- Các biện pháp bảo vệ của DuckDuckGo được chèn vào trang dưới dạng script từ kho mã nguồn mở content-scope-scripts, và được bật/tắt bằng cấu hình phân phối từ xa trong privacy-configuration.
- Chiến lược một là nhiễu: dữ liệu pixel đọc lại từ canvas bị thay đổi theo giá trị sinh từ trang web và phiên duyệt web, nên hash khác nhau theo từng trang và từng phiên.
- Chiến lược hai là giá trị cố định:
hardwareConcurrency,deviceMemory, một phần thuộc tínhscreenvà Battery API trả cùng một đáp án cho mọi người. - Không có gì ở đây khiến bạn trở nên đồng nhất. Engine trình duyệt, User-Agent, bộ render WebGL và phông chữ không bị các tính năng trong bài này đụng tới.
- Hành vi có thể khác nhau theo nền tảng và theo trang, vì cấu hình có công tắc theo từng tính năng và danh sách ngoại lệ theo tên miền.
Hai Chiến Lược, Không Phải Một
Cơ chế chống fingerprinting thường chọn giữa hai ý tưởng. Đồng nhất khiến nhiều người dùng trả về cùng giá trị nên giá trị đó không còn nhận diện được ai; resistFingerprinting của Firefox và Tor hoạt động như vậy. Nhiễu làm xáo trộn đầu ra để bên theo dõi không giữ được giá trị ổn định; ưu nhược điểm của nhiễu được phân tích ở đây.
DuckDuckGo dùng cả hai, theo từng tính năng. Nhiễu dùng cho giá trị gốc có entropy cao và vốn thay đổi (pixel canvas). Giá trị cố định dùng khi chỉ một con số là đủ chuẩn hóa (số lõi, bộ nhớ, độ sâu màu). Đây là sự dung hòa thực dụng nhằm giảm theo dõi xuyên trang mà không làm hỏng quá nhiều website, chứ không phải lời hứa ẩn danh.
Mã Nguồn Thay Đổi Những Gì
Mỗi tính năng là một tệp nhỏ trong injected/src/features/ của content-scope-scripts, kèm một tệp JSON trong features/ của privacy-configuration.
Canvas (fingerprinting-canvas.js). Script bọc getImageData, toDataURL và toBlob. Canvas chỉ bị coi là đáng ngờ sau các lệnh vẽ như fillText, arc hoặc tạo gradient. Khi đọc lại canvas như vậy, script sao chép nó sang một canvas ngoài màn hình rồi sửa pixel ở đó, dùng khóa tạo từ khóa phiên và tên miền của trang (HMAC trên tổng kiểm tra pixel). Thay đổi rất nhỏ: lật bit thấp nhất của một kênh màu ở một phần pixel, bỏ qua các pixel giống hệt pixel lân cận. Hash đổi, hình ảnh trông như cũ. Vì khóa ổn định trong một phiên, đọc cùng canvas hai lần cho cùng các byte, tránh được dấu hiệu "đọc hai lần" nêu trong bài về canvas noise của chúng tôi. Tệp dùng chung fingerprinting-canvas.json còn đặt webGl là "enabled", nên các lệnh WebGL như shaderSource và drawArrays cũng đánh dấu canvas là đáng ngờ, và ảnh render bằng WebGL khi xuất qua toDataURL cũng bị thêm nhiễu tương tự. Điều này chỉ áp dụng cho pixel đã render, không áp dụng cho chuỗi nhà sản xuất GPU và renderer.
Âm thanh (fingerprinting-audio.js). Mã cộng một độ lệch cực nhỏ vào mẫu do getChannelData, copyFromChannel và các phương thức của analyser trả về, cũng theo khóa phiên và tên miền. Tuy nhiên trong tệp dùng chung fingerprinting-audio.json, state của tính năng tại thời điểm viết bài là "disabled", nên đừng mặc định nhiễu âm thanh đang hoạt động. Tín hiệu này làm lộ gì, xem audio fingerprinting.
Phần cứng (fingerprinting-hardware.js). navigator.keyboard bị đặt thành undefined, còn hardwareConcurrency và deviceMemory trả về số đã cấu hình. Cấu hình chung hiện đặt là 4 và 8; hãy đọc lại JSON vì nó được cập nhật từ xa. Bối cảnh xem hardwareConcurrency và deviceMemory.
Màn hình (fingerprinting-screen-size.js). availWidth và availHeight bị ép bằng chiều rộng và cao toàn màn hình, availTop và availLeft bằng 0, colorDepth và pixelDepth bằng 24, giúp che kích thước thanh tác vụ và dock. screenX/screenY cũng được chuẩn hóa cho thiết lập nhiều màn hình. Chiều rộng, chiều cao màn hình vẫn lộ ra, xem screen resolution fingerprinting.
Pin và lưu trữ. fingerprinting-battery.js báo pin đầy và đang sạc, đồng thời vô hiệu hóa các sự kiện; fingerprinting-temporary-storage.js giới hạn hạn mức mà webkitTemporaryStorage.queryUsageAndQuota báo cáo ở mức 4 GB, làm khó việc suy đoán dung lượng ổ đĩa.
Giới Hạn Cần Nói Thẳng
Cấu hình từ xa. Mọi tính năng đều do cấu hình điều khiển. Script canvas thậm chí thoát sớm nếu thiết lập additionalEnabledCheck chưa bật, và tính năng âm thanh bị tắt trong tệp dùng chung. Vì vậy biện pháp nào thực sự chạy phụ thuộc vào bản dựng nền tảng và cấu hình hiện tại, không chỉ vào mã.
Ngoại lệ theo trang. Các cấu hình liệt kê những tên miền tắt biện pháp bảo vệ vì làm hỏng trang. Riêng fingerprinting-hardware.json liệt kê 15 tên miền, ví dụ với gamestop.com lý do là "bấm 'thêm vào giỏ' làm biểu tượng tải hiện thoáng qua, và món hàng không được thêm vào giỏ". Trên các trang đó, biện pháp này bị tắt.
Những tín hiệu chưa được xử lý. Không tệp nào ở trên thay đổi User-Agent, chuỗi renderer WebGL hay danh sách phông chữ đã cài, và trình duyệt được xây trên engine web của nền tảng. Những tín hiệu này vẫn góp vào dấu vân tay. Trong các tệp đã xem không có tính năng nào cho chúng, nhưng chúng tôi chưa kiểm toán toàn bộ dự án, nên hãy hiểu là "các tính năng này không bao phủ" chứ không phải "chưa bao giờ được bảo vệ".
Giá trị cố định có thể gây chú ý. Khi một máy bàn 16 lõi báo chỉ có 4 lõi, script có thể đối chiếu con số đó với các tín hiệu khác, và chính sự không khớp này có thể trở thành một tín hiệu, xem fingerprint hardware mismatch.
So Sánh
| Trình duyệt | Ý tưởng chính | Ví dụ |
|---|---|---|
| DuckDuckGo | Nhiễu cho canvas, giá trị cố định cho vài thuộc tính | Lật bit canvas, số lõi cố định |
| Brave | "Farbling" theo phiên và theo trang trên nhiều API | Xem cập nhật quyền riêng tư của Brave |
| Firefox / Tor | Đồng nhất (resistFingerprinting) | Làm tròn bộ đếm thời gian, kích thước cửa sổ chuẩn |
Đây là so sánh chiến lược, không chấm điểm ai "tốt nhất". Về kỹ thuật nền tảng, hãy bắt đầu với browser fingerprinting. Lưu ý thêm: công cụ tìm kiếm DuckDuckGo là sản phẩm riêng; cam kết riêng tư của nó nói về nhật ký tìm kiếm, không phải fingerprinting của trình duyệt.
Tự Kiểm Tra
Mở công cụ kiểm tra dấu vân tay của chúng tôi trong trình duyệt DuckDuckGo, ghi lại hash canvas, rồi truy cập lại trong một phiên mới. Hash canvas có nhiễu sẽ thay đổi giữa các phiên, còn các giá trị như số lõi và bộ nhớ thiết bị giữ nguyên. Chúng tôi không gắn nhãn "phát hiện bảo vệ của DuckDuckGo": công cụ chỉ hiển thị giá trị thô, kết luận là do bạn.
Câu Hỏi Thường Gặp
Trình duyệt DuckDuckGo có chặn hoàn toàn fingerprinting không?
Không. Nó thay đổi một số giá trị đọc lại và chuẩn hóa một số thuộc tính, nhưng engine, User-Agent, chuỗi WebGL và các tín hiệu khác nằm ngoài những tính năng được mô tả ở đây.
Dấu vân tay canvas của tôi có giống nhau trên mọi trang không?
Nếu bảo vệ canvas đang hoạt động thì không: khóa nhiễu bao gồm tên miền của trang, nên cùng một hình vẽ cho hash khác nhau trên các trang và phiên khác nhau.
Bảo vệ của DuckDuckGo có giống nhau trên mọi thiết bị không?
Không nhất thiết. Các tính năng được bật qua cấu hình phân phối từ xa theo từng nền tảng, nên hành vi có thể khác nhau theo hệ điều hành và phiên bản ứng dụng.


