哪些信号能挺过浏览器更新?一次稳定性分析
我们分析了 50 次 Chrome、Firefox 和 Safari 更新中的信号稳定性。以下是最稳定和最不稳定的指纹信号。
浏览器更新是设备指纹的天敌。每隔 4 至 6 周,Chrome、Firefox 和 Safari 就会推送可能改变信号值的新版本——修改 user-agent 字符串、改变渲染行为、增加或移除 API。正如 W3C 指纹指南中所指出的,浏览器正在积极努力限制可用于指纹识别的表面。对于那些对所有信号一视同仁的指纹系统而言,每一次更新都可能让数百万访客的身份断裂。
我们针对 50 次浏览器更新进行了一次全面的稳定性分析,以回答那个根本问题:哪些信号可以依赖,哪些信号会背叛你?
方法论
我们对 200 台物理设备进行了检测,覆盖 5 种操作系统(Windows 10、Windows 11、macOS Ventura、macOS Sonoma、Ubuntu 22.04)和 3 种浏览器(Chrome、Firefox、Safari)。每台设备连续 14 个月每天运行自动化信号采集,覆盖 50 次主要浏览器版本更新:24 次 Chrome 发布、16 次 Firefox 发布和 10 次 Safari 发布。
对于每个信号,我们跟踪:值的变化频率、变化是否与浏览器更新或外部因素(驱动更新、操作系统补丁)相关,以及变化的幅度(整个值被替换还是仅有轻微变动)。
稳定性分层
第 1 层:坚如磐石(稳定率 99.5% 以上)
这些信号只有在物理硬件变动或驱动更新时才会改变——绝不会仅因浏览器更新而改变。
Hardware Concurrency(navigator.hardwareConcurrency):99.97% 稳定。仅在 1 台因 BIOS 更新影响到超线程的设备上发生变化。Device Memory(navigator.deviceMemory):99.98% 稳定。研究期间有一台设备从 8GB 升级到 16GB。屏幕分辨率和色深:99.92% 稳定。变化与更换显示器和扩展坞事件相关。WebGL Max Texture Size:99.99% 稳定。零次与浏览器相关的变化。仅在一台收到 NVIDIA 驱动更新的设备上发生过一次变化。Audio Sample Rate:100% 稳定。在全部 200 台设备和 50 次更新中零变化。这是我们跟踪的唯一最稳定的信号。
第 2 层:基本稳定(95%–99.5%)
这些信号偶尔会随浏览器更新而变化,但在大多数发布版本中保持稳定。
Canvas 2D Fingerprint:97.8% 稳定。变化发生在 Chrome 118(字体渲染引擎更新)、Chrome 122(亚像素抗锯齿变化)和 Firefox 121(文本整形更新)。每次变化都同时影响该浏览器上的所有设备——这是一种可检测的模式,我们通过感知浏览器版本的匹配来处理。WebGL Renderer String:98.1% 稳定。Chrome 偶尔会重新格式化 ANGLE 包装字符串。底层的 GPU 信息不变,但字符串表示形式会改变。我们从字符串中解析 GPU 型号,而不是直接对字符串进行哈希。Font List:96.4% 稳定。操作系统更新偶尔会增加或移除系统字体。浏览器更新很少影响字体枚举,但 Chrome 120 改变了字体的报告顺序,导致基于哈希的字体指纹失效。我们改用基于集合的比较(集合相似度),而非有序哈希。
第 3 层:中等稳定(80%–95%)
这些信号变化频率不容忽视,但在两次变化之间仍能提供有用的识别价值。
Installed Plugins:89.2% 稳定。Chrome 持续缩减插件数组(navigator.plugins),在某些场景中完全移除了插件的可见性。Firefox 保留了插件枚举。Safari 将其限制为一组标准插件。CSS Feature Detection:91.7% 稳定。每次浏览器发布都会新增 CSS 特性,从而改变我们 CSS 探测所检测到的特性集合。我们给新特性赋予比既有特性更低的权重,以降低其影响。Touch Support:93.1% 稳定。当 Chrome 调整其设备模拟检测时,桌面浏览器偶尔会改变其报告的触摸支持。
第 4 层:波动大(<80%)
这些信号变化频繁,绝不应作为主要的识别锚点。
User Agent String:42.3% 稳定。Chrome 的 User-Agent 缩减计划多次改变了字符串格式。Firefox 每次发布都会更新版本号。Safari 会定期修改 WebKit 版本字符串。这曾经是简单指纹系统的支柱——如今那些系统已经失效。Connection Type(navigator.connection):68.4% 稳定。随网络切换(WiFi 切到蜂窝、不同 WiFi 网络)而变化。Battery API:71.2% 稳定。随充电状态和浏览器 API 可用性而变化。Chrome 在某些场景中限制了 Battery API 的访问。Available Screen Area:76.8% 稳定。随任务栏可见性、窗口管理和显示缩放调整而变化。
跨浏览器对比
在指纹稳定性方面,Chrome 是波动最大的浏览器。Google 积极努力降低可指纹性,这意味着 Chrome 更新破坏的信号比 Firefox 或 Safari 更新更多。在我们的研究期间:
Chrome 在 3.2% 的采集会话中导致了信号变化。Firefox 在 1.8% 的采集会话中导致了信号变化。Safari 在 1.1% 的采集会话中导致了信号变化。
Safari 波动较低,一方面是因为 Apple 每年发布的版本更少,另一方面是因为 Safari 的指纹对抗措施(Intelligent Tracking Prevention)作用于网络层面,而非改变 API 的返回值。
实用建议
基于这次分析,我们对生产环境的指纹系统提出五点建议:
绝不要将 user-agent 用作识别锚点。它是最不稳定的区分性信号。只将它用于浏览器检测和第 3 层的置信度评分。
将硬件信号与软件信号分开。硬件信号(GPU、屏幕、音频)比软件信号(user agent、插件、CSS 特性)稳定 40 倍。应据此进行加权。
对可枚举信号使用基于集合的比较。字体列表、插件列表和特性检测结果应使用集合相似度或类似的集合距离度量来比较,而非有序哈希。顺序变化很常见;内容变化则很罕见。
实现感知浏览器版本的匹配。当 Chrome 118 同时为所有 Chrome 用户改变 canvas 渲染时,你的系统应将其识别为一次浏览器更新,而非大规模的身份断裂。跟踪浏览器版本,并应用特定版本的匹配容差。
持续监控信号稳定性。我们的稳定性百分比基于历史数据。未来的浏览器更新可能改变任何信号的稳定性画像。我们进行持续监控,并在稳定性变化时自动调整信号权重。
对 tracio.ai 的影响
我们的 V3 多层识别架构直接反映了这次稳定性分析。第 1 层信号(硬件)占 60% 权重。第 2 层信号(渲染、字体)占 30% 权重。第 3 层信号(浏览器元数据、连接)占 10% 权重。这样的加权确保最稳定的信号主导识别,而波动信号则在不引发身份断裂的前提下参与置信度评分。
结果是:在 50 次浏览器更新中实现了 99.5% 的识别稳定性,而使用扁平哈希指纹的系统仅为 69%。这一差距并非算法上的巧妙,而是将实证的信号分析应用于架构决策的成果。