FingerprintJS là thư viện mã nguồn mở, khác với sản phẩm Fingerprint trả phí. Nó thu thập gì, chính xác đến đâu, và khác CreepJS ra sao.
Khi tìm kiếm "fingerprintjs", kết quả thường lẫn lộn hai thứ khác nhau. Thứ nhất là một thư viện JavaScript mã nguồn mở mà bất kỳ trang web nào cũng có thể nhúng miễn phí: nó chạy hoàn toàn trong trình duyệt của người truy cập và trả về một chuỗi visitorId. Thứ hai là Fingerprint, dịch vụ nhận dạng thương mại trả phí của cùng công ty, có thêm khâu xử lý phía máy chủ và quảng cáo độ chính xác cao hơn nhiều. Hai thứ này chung tên, chung tổ chức GitHub và chung một hướng tiếp cận — gộp nhiều tín hiệu trình duyệt thành một định danh — nhưng ngoài ra không có nhiều điểm chung. Bài viết này nói về thư viện mã nguồn mở: nó thực sự đọc những tín hiệu nào, biến chúng thành visitorId ra sao, độ chính xác thực tế đến đâu, và so với các công cụ kiểm tra vân tay khác mà trang này đã giới thiệu thì nó đứng ở vị trí nào.
Điểm chính
- Thư viện FingerprintJS miễn phí, cấp phép MIT, và sản phẩm trả phí Fingerprint do cùng một công ty làm ra nhưng không phải là một. Thư viện chạy hoàn toàn phía client, và chính README của nó thừa nhận độ chính xác "thấp hơn đáng kể" so với bản thương mại.
- Thư viện đọc khoảng 40 tín hiệu trình duyệt — vẽ canvas, font đã cài, xử lý âm thanh, thông tin trình kết xuất WebGL, thuộc tính màn hình và phần cứng, múi giờ và ngôn ngữ, tùy chọn hiển thị, v.v. — rồi băm chúng thành một
visitorId. visitorIdtrả lời câu hỏi "đây có phải cùng trình duyệt lần trước không?". Đó là câu hỏi về tính ổn định, khác với câu hỏi "trình duyệt này có khai gian về bản thân không?" của CreepJS và "tổ hợp này hiếm đến mức nào?" của Cover Your Tracks.- Vì không phụ thuộc vào cookie hay bộ nhớ lưu trữ, vân tay này vẫn giữ nguyên ở chế độ ẩn danh và sau khi xóa dữ liệu duyệt web. Tuy vậy, nó vẫn thay đổi khi chính các tín hiệu thay đổi — chẳng hạn sau khi cập nhật trình duyệt hoặc driver đồ họa, hay trên những trình duyệt cố ý ngẫu nhiên hóa các bề mặt lấy dấu vân tay.
- README không đưa ra con số phần trăm độ chính xác cho thư viện mã nguồn mở, nên bài viết này cũng không. Hãy thận trọng với bất kỳ con số cụ thể nào được gán cho nó.
Hai thứ cùng tên "FingerprintJS"
Sự nhầm lẫn bắt nguồn từ chính lịch sử dự án. Công ty FingerprintJS Inc. khởi đầu bằng thư viện mã nguồn mở, sau đó xây dựng sản phẩm thương mại trên cùng ý tưởng, và nay hoạt động dưới tên Fingerprint. Thư viện vẫn được duy trì và vẫn là thứ bạn nhận được khi chạy npm install @fingerprintjs/fingerprintjs — nhưng phần lớn nội dung marketing của công ty, cùng nhiều bài viết của bên thứ ba về "FingerprintJS", thực ra đang mô tả những khả năng chỉ sản phẩm trả phí mới có.
Những khác biệt đáng quan tâm khi bạn cân nhắc một trong hai:
- Nơi chạy. Thư viện mã nguồn mở tính toán mọi thứ trong trình duyệt của người truy cập rồi trả
visitorIdcho trang web. Sản phẩm thương mại còn xử lý từng yêu cầu trên máy chủ của nhà cung cấp, nơi nó dùng được những tín hiệu mà script trên trang không tự đọc được (ví dụ địa chỉ IP kết nối) và đối chiếu lượt truy cập với các lượt trước đó. - Chi phí. Thư viện miễn phí theo giấy phép MIT. Sản phẩm thương mại là API trả phí, tính tiền theo mức sử dụng.
- Tuyên bố của mỗi bên. README nói rõ: vì thư viện tạo vân tay ngay trong trình duyệt, độ chính xác của nó thấp hơn đáng kể so với bản thương mại. Nhà cung cấp quảng cáo độ chính xác cao hơn nhiều cho sản phẩm trả phí chính là nhờ lớp xử lý phía máy chủ đó.
Nếu bạn tìm "fingerprintjs" để có một thư viện miễn phí tự triển khai được, thì dự án mã nguồn mở chính là thứ đó. Còn nếu bạn đang đánh giá giải pháp chống gian lận hay chặn bot cho doanh nghiệp, thứ bạn thực sự đang xem là sản phẩm thương mại — và không nên so sánh hai thứ như thể cái này chỉ là cái kia đổi tên.
Thư viện mã nguồn mở thực sự đọc những gì
Bỏ qua thương hiệu, thư viện này dùng cùng họ kỹ thuật đã được trình bày ở các bài khác trên trang: một tập tín hiệu phía client cố định, được thu thập rồi băm thành một giá trị. Mã nguồn của nó định nghĩa mỗi tín hiệu là một "nguồn entropy" (entropy source) — phiên bản hiện tại có khoảng 40 nguồn. Chia theo nhóm:
- Vẽ canvas. Kỹ thuật vẽ ẩn được giải thích trong Phát hiện vân tay Canvas: Cách website nhận diện thiết bị của bạn: cùng một đoạn chữ và hình khối được kết xuất với khác biệt pixel rất nhỏ tùy GPU, driver và cách dựng font, tạo ra một giá trị băm ổn định mà không cần cookie.
- WebGL. Các tham số WebGL cơ bản như chuỗi nhà sản xuất (vendor) và trình kết xuất (renderer) được báo cáo, cùng danh sách phần mở rộng WebGL được hỗ trợ.
- Âm thanh. Một tín hiệu ngắn được xử lý qua Web Audio API (cơ chế được giải thích trong Lấy dấu vân tay âm thanh: Cách AudioContext nhận diện thiết bị của bạn), kèm độ trễ cơ sở mà audio stack báo cáo. Khác biệt đến từ cách triển khai âm thanh và phần cứng, không phải từ cài đặt nào người dùng tự chọn.
- Font chữ. Những font nào đã được cài, và các họ font mặc định được hiển thị ra sao. Cả hai đều khác nhau tùy hệ điều hành, gói ngôn ngữ và phần mềm đã cài.
- Màn hình và phần cứng. Độ phân giải và độ sâu màu của màn hình, phần diện tích hệ điều hành chiếm quanh vùng màn hình khả dụng (như thanh tác vụ hoặc Dock), số lõi CPU (
hardwareConcurrency), giá trị ước lượng bộ nhớ thiết bị, và khả năng hỗ trợ cảm ứng. - Thiết lập vùng. Múi giờ, ngôn ngữ ưu tiên, và locale dùng để định dạng ngày giờ.
- Nền tảng và trình duyệt. Nền tảng và kiến trúc CPU được báo cáo, nhà phát triển trình duyệt, plugin đã cài, trình xem PDF tích hợp có bật hay không, cùng vài phép kiểm tra riêng theo engine như khả năng dùng Apple Pay.
- Tùy chọn và môi trường. Các CSS media feature như gam màu, chế độ màu cưỡng bức hoặc đảo màu, tùy chọn độ tương phản và giảm chuyển động, hỗ trợ HDR; cookie và các API lưu trữ có dùng được không; trình chặn nội dung nào có vẻ đang bật; và những sai khác nhỏ về số thực dấu phẩy động trong các hàm
Math.
Không tín hiệu nào trong số này là độc quyền của FingerprintJS — Lấy dấu vân tay trình duyệt là gì và cách bảo vệ quyền riêng tư của bạn trình bày các kỹ thuật nền tảng này ở mức tổng quát. Đóng góp của thư viện nằm ở phần đóng gói: một script được duy trì thường xuyên, thu thập trọn bộ tín hiệu và biến chúng thành một chuỗi, để website không phải tự viết logic thu thập.
Từ tín hiệu đến visitorId
Gọi phương thức get() của thư viện sẽ nhận về bốn thứ: visitorId; điểm confidence cho biết thư viện chắc chắn đến đâu về định danh đó; các components thô đã thu thập; và version của thuật toán lấy dấu vân tay. Bản thân visitorId là một giá trị băm 128 bit (hàm x64hash128 của thư viện, một biến thể của MurmurHash3) tính trên toàn bộ các thành phần đã được tuần tự hóa thành một chuỗi. Chỉ cần một thành phần thay đổi là giá trị băm sẽ khác hoàn toàn — không có chuyện visitorId "gần giống".
Độ chính xác thực tế đến đâu?
README đưa ra hai nhận định nên được tách riêng. Thứ nhất, vân tay không phụ thuộc vào cookie hay local storage, nên nó "giữ nguyên ở chế độ ẩn danh/riêng tư và ngay cả khi dữ liệu trình duyệt bị xóa". Đó chính là lý do cốt lõi khiến các website dùng kỹ thuật lấy dấu vân tay: xóa cookie không đặt lại được nó.
Thứ hai, README cho biết vì FingerprintJS tạo vân tay ngay trong trình duyệt, độ chính xác của nó thấp hơn đáng kể so với bản thương mại. README không công bố con số phần trăm, và bài viết này cũng vậy.
Vì sao lại thấp hơn? Có hai nguyên nhân mang tính cấu trúc, suy ra trực tiếp từ cách visitorId được tạo. Đây là phân tích của chúng tôi, không phải tuyên bố của dự án:
- Trôi dạt. Giá trị băm bao trùm mọi thành phần, nên chỉ một tín hiệu thay đổi cũng tạo ra
visitorIdmới. Cập nhật trình duyệt có thể thay đổi cách chữ được vẽ trên canvas; cập nhật driver đồ họa có thể làm lệch đầu ra canvas hoặc chuỗi renderer của WebGL; cài thêm một font sẽ làm thay đổi danh sách font. Những trình duyệt có tính năng chống lấy dấu vân tay, cố ý thêm nhiễu vào đầu ra canvas hoặc âm thanh, có thể trả về giá trị khác nhau giữa các phiên hoặc giữa các website. Một người quay lại mà tín hiệu đã thay đổi sẽ trông như một người truy cập hoàn toàn mới. - Trùng lặp. Vấn đề ngược lại: các thiết bị cùng mẫu, cùng phiên bản hệ điều hành và cùng bản build trình duyệt — ví dụ một loạt laptop văn phòng cấu hình giống hệt nhau, hay hai chiếc iPhone cùng mẫu chạy cùng phiên bản iOS — có thể để lộ tín hiệu gần như y hệt và cho ra cùng một
visitorId, khiến những người khác nhau trông như một.
Một script chỉ chạy trong trình duyệt không thể tự khắc phục hai lỗi này. Hệ thống phía máy chủ thì có thể cân nhắc thêm bằng chứng, như lượt truy cập đến từ mạng nào và lịch sử các lượt trước — đó chính là khoảng trống mà sản phẩm thương mại được xây dựng để lấp đầy.
FingerprintJS đứng ở đâu so với các công cụ kiểm tra khác
visitorId của FingerprintJS chỉ trả lời một câu hỏi cụ thể: đây có phải cùng trình duyệt đã ghé trước đó không? Đó là câu hỏi về tính ổn định, và cần nói rõ nó khác các công cụ khác trên trang này ở điểm nào, vì cùng một trình duyệt có thể nhận ba kết luận nghe rất khác nhau tùy câu hỏi được đặt ra:
- CreepJS hỏi trình duyệt này có nói thật về bản thân không? — một phép kiểm tra tính nhất quán, đối chiếu chéo các nguồn tín hiệu đáng tin và không đáng tin để tìm mâu thuẫn nội tại. Một trình duyệt có thể hoàn toàn nhất quán theo tiêu chuẩn của CreepJS mà vẫn tạo ra một
visitorIdrất ổn định và rất dễ bị theo dõi. - Cover Your Tracks hỏi tổ hợp tín hiệu này hiếm đến mức nào? — một câu hỏi về tính độc nhất được trả lời bằng lý thuyết thông tin, không liên quan đến việc tín hiệu có nhất quán hay ổn định giữa các phiên hay không.
- FingerprintJS không hỏi điều nào trong hai điều trên. Nó hỏi liệu cùng một tập tín hiệu, băm theo cùng một cách, có cho ra cùng một định danh lần nữa hay không — một câu hỏi về khả năng lặp lại, không nói lên tổ hợp đó phổ biến đến đâu hay tín hiệu riêng lẻ nào có dấu hiệu bị làm giả.
Vì Sao Các Công Cụ Kiểm Tra Vân Tay Bất Đồng Về Bạn phân tích quy luật này một cách tổng quát: tính độc nhất, tính nhất quán và tính ổn định danh tính là ba phép đo khác nhau, nhưng thường được gọi chung bằng những từ mơ hồ như "điểm" hay "ID", và công cụ được xây cho một phép đo vốn không nhằm trả lời hai phép đo còn lại. Nếu bạn từng đặt một kết quả kiểu visitorId cạnh điểm tin cậy của CreepJS hay chỉ số ẩn danh của Cover Your Tracks và thấy chúng không khớp nhau, điều đó hoàn toàn bình thường — chúng không trả lời cùng một câu hỏi. BrowserLeaks Giải Thích: Mỗi Bài Test Kiểm Tra Điều Gì bổ sung dạng thứ tư của nhóm công cụ này: một bộ bài test báo cáo từng bề mặt riêng biệt thay vì gộp mọi thứ thành một con số.
Kiểm tra tín hiệu của chính bạn
Kiểm tra vân tay của BrowserInsight hiển thị nhiều nhóm tín hiệu giống với những gì thư viện này đọc — canvas, WebGL, âm thanh, font, màn hình và các thuộc tính navigator — liệt kê từng mục, kèm các phép kiểm tra tính nhất quán để cảnh báo khi chúng mâu thuẫn nhau. Công cụ không tính thêm một visitorId riêng. Thay vào đó, nó cho bạn thấy các bề mặt thô mà một thư viện lấy dấu vân tay sẽ đem đi băm, để bạn biết mục nào khiến trình duyệt của mình nổi bật. Muốn tận mắt thấy hiện tượng trôi dạt: chạy kiểm tra một lần, sau đó cập nhật trình duyệt hoặc bật tính năng chống lấy dấu vân tay của trình duyệt (nếu có) rồi chạy lại — giá trị canvas, WebGL hoặc font nào thay đổi chính là loại thay đổi cũng sẽ khiến FingerprintJS tạo ra visitorId mới.
Câu hỏi thường gặp
Thư viện mã nguồn mở FingerprintJS có phải là sản phẩm Fingerprint không?
Không. Cả hai do cùng một công ty làm ra và cùng dựa trên cách tiếp cận băm, nhưng thư viện mã nguồn mở chạy hoàn toàn phía client và, theo chính README của nó, kém chính xác hơn đáng kể; còn sản phẩm Fingerprint trả phí có thêm khâu xử lý phía máy chủ mà thư viện miễn phí không có.
Có thể dùng thư viện mã nguồn mở cho website thương mại không?
Thư viện được phát hành theo giấy phép MIT, loại giấy phép cho phép sử dụng thương mại. Hãy xem tệp giấy phép trong kho mã để biết điều khoản chính xác.
FingerprintJS có thu thập hay lưu trữ dữ liệu về tôi không?
Bản thân thư viện mã nguồn mở chỉ là một script chạy trong trình duyệt của bạn và trả về visitorId. Định danh đó sau đó có được lưu hay không, lưu ở đâu, hoàn toàn phụ thuộc vào website triển khai nó chứ không phải thư viện. Hãy đọc chính sách quyền riêng tư của từng website cụ thể thay vì tự suy đoán cách kết quả của script lấy dấu vân tay được xử lý.
Vì sao visitorId của tôi thay đổi giữa các lần truy cập?
Vì nó là giá trị băm của mọi tín hiệu mà thư viện đọc, chỉ cần một tín hiệu thay đổi là ID sẽ khác. Nguyên nhân thường gặp gồm cập nhật trình duyệt, cập nhật driver đồ họa, cài thêm font, và các tính năng chống lấy dấu vân tay ngẫu nhiên hóa đầu ra canvas hoặc âm thanh. Ngược lại, mở cửa sổ ẩn danh hay xóa cookie về nguyên tắc không làm nó thay đổi — README cho biết vân tay giữ nguyên trong cả hai trường hợp.
FingerprintJS có chính xác hơn CreepJS hay Cover Your Tracks không?
Phép so sánh này không thực sự hợp lý, vì ba công cụ không đo cùng một thứ. FingerprintJS hỏi liệu cùng một người truy cập có nhận cùng một định danh hai lần không; CreepJS hỏi tín hiệu của trình duyệt có nhất quán với nhau không; Cover Your Tracks hỏi tổ hợp đó hiếm đến mức nào. "Chính xác hơn" chỉ có ý nghĩa khi hai công cụ cùng trả lời một câu hỏi.
Đọc thêm
- Vì Sao Các Công Cụ Kiểm Tra Vân Tay Bất Đồng Về Bạn
- CreepJS: Cách phát hiện nói dối trong vân tay bắt giả mạo
- BrowserLeaks Giải Thích: Mỗi Bài Test Kiểm Tra Điều Gì
- Phát hiện vân tay Canvas: Cách website nhận diện thiết bị của bạn
- Lấy dấu vân tay âm thanh: Cách AudioContext nhận diện thiết bị của bạn
- Lấy dấu vân tay trình duyệt là gì và cách bảo vệ quyền riêng tư của bạn


