TRACIO 的身份识别系统会根据 130 多种浏览器信号生成稳定的访客标识符。该标识符在会话切换、隐身模式、VPN 更换以及清除 Cookie 后依然保持不变。本页将说明完整的身份识别流程。
客户端会跨 10 个类别采集 130 多种不同的浏览器信号。每种信号探测浏览器和设备的不同方面,从硬件特性到渲染行为。
| 分组 | 信号数 | 稳定性 | 示例 |
|---|---|---|---|
| 硬件 | 12 | 非常高 | 屏幕分辨率、设备内存、硬件并发数、触摸支持 |
| 渲染 | 9 | 高 | Canvas 指纹(文本 + 几何)、WebGL 渲染器、音频处理 |
| 字体 | 5 | 高 | 可用系统字体(测试了 69 个字体族)、字体首选项、MathML 渲染 |
| 平台 | 25 | 中 | User-Agent、navigator 属性、时区、语言、供应商 |
| CSS 引擎 | 10 | 中 | 媒体查询响应(配色方案、HDR、减弱动态效果、强制颜色) |
| 存储 | 10 | 中 | Cookie 支持、localStorage、sessionStorage、存储配额 |
| WebGL | 9 | 高 | GPU 供应商、渲染器(未掩码)、着色器精度、扩展支持 |
| 网络 | 3 | 低 | 连接 RTT、TURN 探测、应用版本 |
| Bot 指标 | 15 | 不适用 | Webdriver 标志、自动化框架、eval 长度、无头标记 |
| 自定义 | 14 | 不定 | Math 指纹、WASM 特性、架构检测 |
并非所有信号对身份识别都同样有用。信号按稳定性分类:
第 1 层(冻结):几乎从不改变的硬件与渲染信号。Canvas 指纹、WebGL 渲染器、音频指纹、GPU 参数、字体枚举、数学运算、架构字节。
第 2 层(半稳定):随浏览器更新或配置更改而改变的信号。User-Agent、Client Hints、插件、CSS 媒体查询、存储能力。
第 3 层(易变):频繁改变的信号。屏幕分辨率(显示器更换)、时区(出行)、语言首选项、连接属性。
访客 ID 使用三层哈希系统计算,该系统在稳定性与可扩展性之间取得平衡:
Visitor ID = [Tier1Hash][Tier2Hash][Tier3Hash] 20 chars 10 chars 10 chars ──────── ──────── ──────── base62 base62 base62第 1 层仅使用硬件和渲染引擎固有的冻结信号。这些信号只有在用户更换到另一台物理设备或进行重大硬件变更时才会改变。
包含的信号:Canvas 指纹哈希、WebGL 渲染器(未掩码)、WebGL 供应商(未掩码)、音频指纹、字体枚举哈希、WebGL 参数哈希、数学运算哈希、架构字节(ARM 与 x86)。
算法:
key1=value1|key2=value2|...(键按字母顺序排序)第 1 层是有意冻结的。永远不会向第 1 层添加新信号,从而确保身份核心在服务器更新后保持稳定。
第 2 层捕获浏览器和操作系统环境。当用户更新浏览器、安装扩展或修改系统设置时,这些信号会改变。
包含的信号:User-Agent 数据、Client Hints(品牌、平台、架构)、navigator 属性(供应商、平台、语言)、插件列表、屏幕颜色深度、设备内存、硬件并发数。
第 3 层捕获在会话之间可能改变的易变信号。这些信号用于置信度评分和模糊匹配,但不影响核心身份。
包含的信号:屏幕分辨率、时区、语言、DOM 拦截器、存储能力、CSS 媒体查询响应、连接属性。
每一层都使用 MurmurHash3-x64-128 进行哈希,这是一种快速的非加密哈希函数,可生成 128 位输出。该算法:
MurmurHash3 提供出色的分布性(输入的每一位都影响输出的每一位),且速度足以满足实时计算。它不具备加密安全性,但指纹哈希并不要求这一点。
Input: "canvas=abc123|webgl_renderer=ANGLE|audio=0.04852" ↓ MurmurHash3-x64-128Output: 0x7f4a8c2d1e3b5f6a 0x9d8c7b6a5e4f3d2c ↓ base62 encodeResult: "X7fh2Hg9LkMn3pQr5tBv"置信度评分(0.0 至 1.0)表示系统对访客识别结果的确定程度:
当 _vid_t cookie 与已知访客匹配时,置信度设为 1.0。该 cookie 保存访客的 UID,服务器会据此对其记录进行验证。这是最快、最可靠的识别路径。
没有既往记录的新访客获得 0.90 的置信度评分。由于没有可供比较的现有记录,因此不存在误匹配的风险。
对于没有 cookie 匹配的回访访客,系统根据以下因素计算置信度:
信号频率加权(IDF):在全球总体中更为独特的信号获得更高的权重。稀有的 WebGL 渲染器比常见的屏幕分辨率更具识别性。
模糊匹配:系统使用位级汉明距离将当前指纹与已存储的指纹进行比较。信号按层分组,每一层的匹配得分独立加权。
历史一致性:如果访客的信号在多次访问中保持稳定,置信度会上升。如果信号频繁波动,置信度会下降。
| 场景 | 典型评分 | 说明 |
|---|---|---|
| Cookie 匹配 | 1.000 | _vid_t cookie 的 UID 已在服务器端验证 |
| 首次访问 | 0.900 | 没有可供比较的既往记录 |
| 强指纹匹配 | 0.990-0.999 | 所有第 1 层信号匹配,大部分第 2 层匹配 |
| 部分匹配(浏览器更新) | 0.950-0.989 | 第 1 层匹配,第 2 层已改变(新 UA) |
| 弱匹配(重大变更) | 0.850-0.949 | 部分第 1 层信号已改变 |
| 不明确 | 0.500-0.849 | 数据库中存在多个可能的匹配 |
TRACIO 使用第一方 cookie(_vid_t)在会话之间维护访客身份:
_vid_tSameSite=Lax,在 HTTPS 上为 Secure(非 HttpOnly —— agent 在客户端读取它)该 cookie 由服务器端(通过 Set-Cookie 响应头)和客户端 agent 共同签发,并且当 cookie 被阻止时,UID 还会镜像到 localStorage 作为回退。
服务器尝试在逐步更宽泛的域范围上设置 cookie:
app.example.com → example.com → com系统使用能够成功设置 cookie 的最宽泛的域。这可确保 cookie 在各子域之间保持不变。
当第 1 层信号产生匹配的哈希时,TRACIO 能够在同一设备上跨不同浏览器识别同一个人。由于第 1 层依赖硬件和渲染特性(Canvas、WebGL、音频、字体),这些信号在同一台机器上基于 Chromium 的浏览器之间往往完全相同,而在不同引擎之间(Chromium 与 Firefox 与 Safari)则会减弱。将桌面访客匹配到移动访客并不在预期之内 —— 硬件和渲染面各不相同。
跨浏览器匹配本质上是一种置信度较低的操作,在评分中也据此处理。