无需 Cookie 的设备指纹识别:工作原理详解
Cookie 正在消亡。本文介绍设备指纹识别如何在不依赖任何客户端存储的情况下实现持久化的设备识别。
Cookie 正在消亡。Safari 的智能防跟踪(Intelligent Tracking Prevention,ITP)将 cookie 的有效期限制为 7 天。Firefox 的增强型跟踪保护完全屏蔽第三方 cookie。Chrome 的 Privacy Sandbox 正在弃用第三方 cookie。GDPR 的同意要求意味着越来越多的用户拒绝 cookie 横幅。
对于欺诈防范来说,这是个问题。如果无法持久地识别设备,你就无法追踪惯犯、检测多账号行为,也无法把可疑会话关联起来。设备指纹识别通过设备的技术特征来识别设备,从而解决这一问题——不需要 cookie,不需要 localStorage,不需要任何形式的客户端存储。
信号类别
被动指纹识别(无需 JavaScript)
在你的页面加载之前,浏览器就已经通过网络层信号泄露了信息:
TLS 指纹识别(JA4)。 TLS 的 Client Hello 消息包含加密套件、扩展、椭圆曲线和签名算法。我们使用 JA4 哈希——它是 JA3 的现代替代方案,粒度更细。
TCP/IP 协议栈分析。 TCP 窗口大小、TTL 值和 MSS 设置在不同操作系统之间各不相同。Linux、Windows 和 macOS 各自都有具有特征性的 TCP 协议栈配置。
HTTP 头部分析。 头部的排列顺序、Accept-Language 值和连接偏好在不同浏览器之间存在差异。
主动指纹识别(客户端 JavaScript)
Canvas 指纹识别。 我们绘制一个精心设计的场景——特定的文字、几何图形和渐变。由于抗锯齿、次像素渲染和颜色混合的差异,不同的 GPU 在渲染时会产生细微的像素级差异。我们对像素数据进行哈希处理。
WebGL 指纹识别。 WebGL 会暴露 GPU 的厂商/渲染器字符串、最大纹理尺寸、支持的扩展以及着色器能力。这些数据能够强有力地识别 GPU 型号和驱动版本。
AudioContext 指纹识别。 我们生成一个测试信号并分析它被处理的方式。由于浮点精度的差异,不同的音频硬件会产生可测量的不同输出。
字体枚举。 可用的系统字体因操作系统、语言包和已安装软件而异。我们使用 canvas 测量技术检测约 300 种诊断性字体。
Navigator 属性。 CPU 核心数、设备内存、平台、语言、时区、屏幕分辨率、颜色深度、指针和触控能力。
熵分析
并非所有信号都具有相同的权重。我们测量每个信号的熵:
| 信号类别 | 大致熵值 |
|---|---|
| Canvas + WebGL 组合 | 约 18 比特 |
| 字体列表 | 约 8 比特 |
| AudioContext | 约 5 比特 |
| Navigator 属性 | 约 7 比特 |
| TLS 指纹 | 约 6 比特 |
| 屏幕 + 显示 | 约 4 比特 |
| 时区 + 语言 | 约 3 比特 |
综合来看,我们的 130 多个信号提供了约 50 多比特的熵——足以唯一识别超过 1000 万亿台不同设备。
从信号到稳定哈希
原始信号采集只是问题的一半。浏览器更新会改变 user agent 字符串。驱动更新会改变 WebGL 参数。字体安装会改变字体列表。
模糊匹配
我们不要求精确匹配,而是使用一种按稳定性和熵对信号加权的模糊匹配算法。稳定信号(canvas、GPU 型号)比易变信号(user agent、屏幕分辨率)拥有更高的权重。
候选生成在最稳定的信号上使用局部敏感哈希(LSH)来识别潜在的匹配项。相似度评分在所有信号类别上计算加权分数,并经过校准,使得正常的设备变化不会改变访客 ID,而真实的设备更换则会。
由此实现了 99.5% 的准确率——在浏览器更新、清除 cookie、隐身模式和切换浏览器的情况下都能正确识别回访用户。
保护隐私的架构
服务器端处理。 所有指纹计算都在我们的服务器上进行。客户端 agent 只采集原始信号,而不计算或存储指纹哈希。
不存储个人身份信息(PII)。 我们存储的是指纹哈希,而不是原始信号。该哈希是一个单向函数。
数据驻留。 欧盟客户的数据在欧盟境内的数据中心处理和存储。GDPR 第 6(1)(f) 条将欺诈防范纳入正当利益的范畴。
跨浏览器识别
最困难的挑战是在不同浏览器之间识别同一台设备。我们依赖与浏览器无关的信号:GPU 硬件、屏幕特征、时区、语言设置、已安装字体(操作系统层面)以及 TCP/IP 协议栈特征。
跨浏览器关联的准确率约为 94%——低于同一浏览器的识别准确率,但足以检测同一设备上跨浏览器的多账号行为。
集成
添加设备指纹识别只需三行代码。agent 异步加载,在 50 毫秒内采集信号,并将其发送到我们的 API。服务器的响应包含访客 ID、置信度分数以及全部 24 个 Smart Signals。