浏览器指纹取代Cookie:隐私追踪的新常态

浏览器指纹正取代Cookie成为追踪用户的新手段。即便清除数据或切换设备,在线标识仍可能保持稳定。Google虽承诺淘汰Cookie却未兑现,反而在广告产品中普及了更隐蔽的设备指纹技术。

在数字身份追踪领域,一种被称为“浏览器指纹”的技术正逐渐取代传统的 Cookie,成为识别用户的主要手段。尽管清除 Cookie、使用 VPN 或切换设备看似能重置身份,但在特定条件下,用户的在线标识往往依然保持稳定。

硬件特征组合生成唯一标识

这种持久性引发了关于隐私的深层担忧。许多网站依赖广告收入维持运营,而广告商通过收集和分析用户数据来精准投放广告。根据部分平台的隐私政策,这些数据甚至可能被用于交易。对于普通用户而言,这不仅仅是广告相关性的问题,更关乎个人数据的控制权。

隐私悖论与数据商品化

“我没有什么可隐藏的。” “我更喜欢相关的广告。” “反正数据都是匿名的。”

然而,现实情况是,追踪的目的往往超越了单纯的广告投放。执法机构或政府若对数据感兴趣,同样可能成为购买方。从宏观视角看,这些海量数据构成了经济、社会及人类心理的数字映射,被视为 21 世纪预测未来的“水晶球”。在这种模式下,用户本身成为了被出价竞标的产品。

行业博弈:Cookie 的退场与指纹的兴起

欧盟曾推出严格的合规标语以限制第三方 Cookie 的使用。如果监管步伐快于科技公司的调整速度,这可能意味着后者在隐私保护上的消极应对。考虑到 Google 占据了全球浏览器市场的三分之二份额,其动向至关重要。

作为全球最大的广告公司,Google 曾承诺建立以隐私为首的新规则,并誓言淘汰 Cookie。然而,其推出的“隐私沙盒”(Privacy Sandbox)方案被认为效果有限。最终,Google 选择保留 Cookie,仅在某些认证场景下隐藏 IP 地址,且并未完全兑现这一承诺。相反,一种更为隐蔽且强大的替代方案——设备指纹技术,正在其广告产品中普及。

浏览器指纹的工作原理

当用户访问网站时,浏览器向服务器发送请求,服务器返回代码供浏览器执行。这一过程本身就泄露了包括浏览器类型、语言、操作系统版本及 IP 地址在内的基础信息。IP 地址通常还能揭示地理位置。

随着安全浏览技术的进步,网站代码无法直接读取其他站点存储的数据或未经许可访问本地文件。Chrome 和 Edge 在此方面遵循标准定义,而 Safari(特别是 iOS/macOS 26+ 版本)、Firefox、Brave 以及 Tor 浏览器则将隐私保护纳入核心定义。Mullvad 浏览器也因其隐私优先策略受到关注。

关键在于,代码可以在用户硬件上运行并测量硬件特性,从而生成一致且独特的读数。目前主要存在两种防御思路:

  1. 添加噪音:如 Brave 浏览器所做的,使生成的指纹具有不一致性。
  2. 标准化外观:让所有用户看起来一样,消除区分度。Tor 和 Mullvad 采用此方法。

构建唯一标识:数据来源与信息熵

浏览器指纹由两部分构成:网络请求信息和代码执行环境。

网络请求中的数据通常较为脆弱或通用:

  • IP 地址:虽然固定 IP 极具辨识度,但移动网络、共享 WiFi、VPN 及动态 ISP 分配使得 IP 容易变动。
  • HTTP 头信息:如 User-Agent 和 Accept-Language,显示浏览器、系统及语言设置。

相比之下,在设备上执行代码可以获取无需许可提示的硬件参数,这些数据极其稳定:

  • GPU 信息:供应商、型号、驱动行为。
  • CPU 信息:供应商、线程数、行为特征。
  • 内存大小
  • 显示属性:分辨率、像素比率、刷新率。
  • 音频处理特性
  • 设备型号

软件层面的已安装字体、扩展插件及系统信息同样具有价值。虽然数百万人使用最新版 Chrome、M4 芯片 Mac 或法语浏览器,但当组合特定硬件测量值时,匹配群体规模急剧缩小,直至变得独特。

指纹无需全球唯一,只需足够独特即可。例如,邮政编码(由 IP 推断)、出生日期(平台泄露)和性别(广泛填写)这三个变量足以唯一识别超过 60% 的美国人口。增加变量可进一步缩小候选范围。

信息论视角下的指纹强度

理解指纹的唯一性可类比于“Akinator”猜角色游戏。通过询问“角色是否为男性?”等问题,每次回答都能排除一半候选人。若答案为“是”,则获得 log₂(100/50) = 1 比特的信息。

答案的价值取决于其稀有程度(惊喜值):

  • 每 2 人中 1 人有该特征(如男性):1 比特。
  • 每 8 人中 1 人有该特征(如胡子):3 比特。
  • 每 128 人中 1 人有该特征(如独眼):7 比特。

问题的整体价值(熵贡献)需综合计算所有可能答案的概率加权值:

Answer Probability Surprisal Entropy contribution
Yes 1/128 log₂(128 / 1) = 7 bits 1/128 x 7 = ~0.055
No 127/128 log₂(128 / 127) = ~0.0113 bits 127/128 x 0.0113 = ~0.011

该问题的平均熵贡献约为 0.066 比特。当组合独立特征时,比特数相加或比例相乘。例如,“男性 + 胡子 + 独眼”理论上对应 11 比特(1/2048)。但在实际应用中,特征间存在相关性(如胡子强烈暗示男性),因此简单相加并不准确,需借助贝叶斯定理分析。

此类推理在其他领域亦有应用:

  • 医疗诊断:针对患病率仅为 0.01% 的疾病,即使测试准确率高达 99%,阳性结果误诊的可能性仍远高于真阳性的可能性,需更多证据支持。
  • 密码学:四个随机单词组成的密码强度相当于八个随机键盘字符,但更易记忆。
  • 法医科学:在百万人口城市中锁定一人约需 20 比特信息。目击者描述若匹配 1/1000 的人,仅提供 10 比特,仍留下千名嫌疑人。

用户可通过 coveryourtracks.eff.org 测试自身指纹的独特性及各项数据的熵值。

目前,使用 Chrome 的用户几乎等同于佩戴着可见的身份标签。Safari 和 Firefox 提供一定程度的保护,但仍可能被高级追踪器识别。Brave、Tor 和 Mullvad Browser 是当前主流浏览器中实施高级反指纹保护的少数选项。

若不更换浏览器,JShelter 等扩展程序可通过拦截 API 调用来干扰指纹脚本,但这可能导致网站功能异常。Firefox 的“抵抗指纹跟踪”功能也存在类似问题。讽刺的是,隐私扩展本身会使浏览器配置变得罕见,反而增加了独特性。聪明的追踪器会忽略被干扰的信号,专注于未受影响的特征。

引擎级保护优于扩展程序。若要有效防止追踪,彻底更换具备内置隐私功能的浏览器是必要之举。

本页演示使用的指纹采集方法

以下代码片段展示了如何通过测量设备特性生成哈希值。任何单一变量的改变都会导致哈希值不同。专业追踪系统更为复杂,能在单个变量变化时维持身份关联。

  1. OfflineAudioContext

    通过压缩器渲染短音调而不播放,结果中的微小浮点差异取决于浏览器音频引擎和 CPU。

    const off = new OfflineAudioContext(1, 5000, 44100);
    
    const data = (await Promise.race([off.startRendering(), timeout])).getChannelData(0);
    let sum = 0;
    for (let i = 4500; i < 5000; i++) sum += Math.abs(data[i]);
    return sum.toFixed(3);
    
  2. WebGL

    读取 GPU 供应商和型号(不含版本号)、GPU 及其驱动支持的功能,以及渲染小三角形的像素数据。

    const gl = document.createElement('canvas').getContext('webgl');
    const dbg = gl.getExtension('WEBGL_debug_renderer_info');
    return gpuName(gl.getParameter(dbg ? dbg.UNMASKED_RENDERER_WEBGL : gl.RENDERER) || '');
    
    
    return fnv1a(new TextEncoder().encode([...(gl.getSupportedExtensions() || []).sort(), ...limits, ...precision].join('|')));
    
    gl.drawArrays(gl.TRIANGLES, 0, 3);
    gl.readPixels(0, 0, canvas.width, canvas.height, gl.RGBA, gl.UNSIGNED_BYTE, px);
    
  3. canvas

    绘制多种字体文本、Emoji 和渐变,然后读回像素;抗锯齿和字体渲染依赖于操作系统、GPU 和字体库。

    ctx.font = '15px "Times New Roman", serif';
    ctx.fillText('Sphinx of black quartz 🦊', 4, 22);
    
    const data = ctx.getImageData(0, 0, 240, 60).data;
    
  4. Intl

    获取时区、日期和数字设置;VPN 改变 IP 位置但不改变时区。

    const date = Intl.DateTimeFormat().resolvedOptions();
    
    return [date.timeZone, date.locale, date.calendar, date.numberingSystem, hourCycle, (1234567.891).toLocaleString()].join('/');
    
  5. navigator

    获取 CPU 核心数、内存大小(仅限 Chrome)和浏览器语言。

    return [navigator.hardwareConcurrency, navigator.deviceMemory, navigator.language].join('/');
    
  6. crypto.subtle

    使用 SHA-256 对所有值进行哈希处理,并根据哈希结果选取昵称的特征和动物。

    const digest = await crypto.subtle.digest('SHA-256', bytes);
    
    nickname: stranger || `${pick(TRAITS, hex, 0)} ${pick(ANIMALS, hex, 8)}`,
    

评论 0

0/500

评论需审核后展示,请文明发言

💬
还没有评论,来说两句

相关阅读