Giải thích về TLS Fingerprinting và mã băm JA4
Vì sao thông điệp TLS Client Hello là mỏ vàng để định danh thiết bị — và cách mã băm JA4 mang lại dấu vân tay ổn định, tồn tại qua các bản cập nhật trình duyệt.
Mỗi kết nối HTTPS đều bắt đầu bằng một bắt tay TLS, và mỗi lần bắt tay TLS đều bắt đầu bằng một thông điệp Client Hello. Thông điệp này chứa vô số thông tin về client đang kết nối — cipher suite, extension, các đường cong được hỗ trợ, thuật toán chữ ký — những thứ khác biệt đáng kể giữa các trình duyệt, phiên bản và hệ điều hành. TLS fingerprinting thu thập thông tin này và dùng nó làm tín hiệu định danh.
Trong một Client Hello có những gì?
Khi một trình duyệt kết nối tới máy chủ HTTPS, nó gửi một thông điệp Client Hello chứa: phiên bản TLS mà nó hỗ trợ, danh sách các cipher suite mà nó sẵn sàng sử dụng, các extension TLS mà nó bao gồm (như SNI, ALPN và key share), các đường cong elliptic mà nó hỗ trợ, các thuật toán chữ ký mà nó chấp nhận, và các phương thức nén mà nó cung cấp.
Mỗi họ trình duyệt có một dấu vân tay đặc trưng. Chrome, Firefox và Safari đều gửi thứ tự cipher suite khác nhau, tập extension khác nhau và các đường cong ưu tiên khác nhau. Ngay cả trong cùng một họ trình duyệt, các phiên bản khác nhau cũng có thể gửi những thông điệp Client Hello hơi khác biệt khi cipher suite được thêm vào hoặc bị loại bỏ.
Từ JA3 đến JA4
JA3 là mã băm TLS fingerprinting đầu tiên, được Salesforce giới thiệu năm 2017. Nó ghép nối phiên bản TLS, cipher suite, extension, đường cong elliptic và định dạng điểm EC thành một chuỗi rồi tính mã băm MD5. Dù mang tính đột phá, JA3 có những hạn chế: nó tạo ra một mã băm mờ đục duy nhất khó phân tích, và một thay đổi nhỏ ở bất kỳ trường nào cũng tạo ra một mã băm hoàn toàn khác.
JA4, được FoxIO giới thiệu năm 2023, cải tiến JA3 theo nhiều cách. Nó tạo ra một dấu vân tay có cấu trúc với ba thành phần: một tiền tố dễ đọc (như "t13d1715h2" — TLS 1.3, 17 cipher suite, 15 extension, HTTP/2), một mã băm có thứ tự của các cipher suite, và một mã băm có thứ tự của các extension. Cấu trúc này khiến dấu vân tay JA4 có thể phân tích được ngay từ cái nhìn đầu tiên, đồng thời vẫn duy trì độ chính xác cần thiết cho việc định danh.
Vì sao TLS Fingerprint quan trọng với Device Intelligence
TLS fingerprint có giá trị vì chúng được thu thập trước khi bất kỳ JavaScript nào thực thi. Một bot giả mạo user agent, làm giả kết xuất canvas và vá các thuộc tính navigator vẫn gửi một thông điệp Client Hello chính hiệu từ bất kỳ thư viện TLS nào mà nó thực sự sử dụng. Nếu Client Hello nói "thư viện crypto/tls của Go" nhưng user agent lại nói "Chrome 124", ta biết có gì đó đang bị giả mạo.
Việc kiểm chứng chéo này cực kỳ mạnh mẽ cho việc phát hiện bot. Hầu hết các framework tự động hóa — Selenium, Puppeteer, Playwright — đều dùng ngăn xếp TLS gốc của trình duyệt, nên TLS fingerprint của chúng khớp với trình duyệt mà chúng điều khiển. Nhưng các HTTP client tùy chỉnh, các trình cào dữ liệu dựa trên Go, và các script Python dùng thư viện requests đều có TLS fingerprint đặc trưng, lập tức nhận diện chúng là các client không phải trình duyệt.
Độ ổn định của TLS Fingerprint
Một mối lo với TLS fingerprinting là độ ổn định qua các bản cập nhật trình duyệt. Khi Chrome thêm hoặc gỡ một cipher suite, TLS fingerprint sẽ thay đổi. Trên thực tế, điều này xảy ra ít thường xuyên hơn bạn tưởng. Danh sách cipher suite của Chrome tương đối ổn định — những thay đổi lớn diễn ra một hoặc hai lần mỗi năm, chứ không phải với mỗi phiên bản.
Định dạng có cấu trúc của JA4 giúp ích ở đây. Phần tiền tố dễ đọc giữ nguyên ổn định qua các thay đổi phiên bản nhỏ (số lượng cipher suite và extension không thay đổi thường xuyên), nên ngay cả khi mã băm chi tiết thay đổi, tiền tố vẫn mang lại tính liên tục. Trong hệ thống định danh đa tầng của chúng tôi, dữ liệu TLS fingerprint được đặt ở Tier 2 — đủ ổn định để đóng góp vào việc định danh, nhưng được xử lý qua so khớp xuyên phiên để xử lý độ trôi dạt dự kiến.
Thu thập phía máy chủ
Không giống các tín hiệu phía client vốn cần JavaScript thực thi, TLS fingerprint được thu thập hoàn toàn phía máy chủ. Các edge server của chúng tôi kiểm tra quá trình bắt tay TLS thô và trích xuất Client Hello trước khi kết nối được thiết lập. Điều này có nghĩa là TLS fingerprinting vẫn hoạt động ngay cả khi JavaScript bị chặn, khi trình duyệt cài các extension bảo vệ quyền riêng tư, hoặc khi client hoàn toàn không phải là một trình duyệt.
Bản chất phía máy chủ này cũng khiến TLS fingerprint khó bị giả mạo. Về lý thuyết, có thể tạo ra một TLS Client Hello tùy chỉnh bắt chước một trình duyệt cụ thể, nhưng làm được điều đó đòi hỏi phải triển khai TLS ở mức thấp — tốn công hơn nhiều so với việc đổi một chuỗi user agent. Hầu hết các công cụ giả mạo không cố làm điều này.
Tích hợp với Định danh Thiết bị
Trong engine định danh thiết bị của chúng tôi, TLS fingerprint vừa đóng vai trò tín hiệu vừa đóng vai trò trình xác thực. Với vai trò tín hiệu, nó đóng góp vào dấu vân tay thiết bị tổng thể với trọng số định danh riêng. Với vai trò trình xác thực, nó cung cấp một phép kiểm tra chéo đối với danh tính trình duyệt được khai báo. Nếu các tín hiệu JavaScript nói "Chrome trên macOS" nhưng TLS fingerprint lại nói "Firefox trên Linux", sự chênh lệch đó sẽ kích hoạt cờ giả mạo trong phân tích Smart Signals của chúng tôi.