解释

浏览器指纹是怎么回事

在读你的 Cookie 之前,网站先量你的浏览器:它的图形栈画出什么、音频栈听起来是什么样、走的是哪只时钟。这些测量结果就是指纹,而账号之间被关联起来的原因,几乎从来不是某一个值不对——而是一组彼此对不上的值。

指纹不是一个数字。它是页面能在几毫秒内读到的几十项属性,不需要授权,也不留痕迹,而它们对网站的价值在于:你清了 Cookie、换了 IP,它们依然在。本页讲的是被量走的是什么、为什么一致比隐藏更要紧,以及 Argus 在哪里替换掉这些答案。

测量

网站实际读到的是什么

真正有意思的是那些底下有硬件的信号。让两台机器画同一个图形,画出的像素会有细微差别,因为 GPU、驱动和字体光栅化器都不一样——于是页面对结果取哈希,得到一个对你的设备稳定、在其他所有人当中又很罕见的数字。同样的手法在音频栈上也管用。与它们并排的是那些声明式属性:平台、语言、时区、屏幕尺寸、设备内存、CPU 核心数。

这些都不是什么冷门或隐藏的东西。每一项都是有文档的 Web API 在干它被设计出来要干的活,也正因如此,把它们统统屏蔽不是一个选项——一个拒绝报告屏幕尺寸的浏览器,比一个报告了普通屏幕尺寸的浏览器更扎眼。Argus 覆盖这些面:

  • Canvas、WebGL(包括对外报告的 vendor 和 renderer)以及音频
  • 平台、语言、时区、屏幕、设备内存和 CPU 核心数

指纹

一个对不上的值毁掉整组

这就是让人赔掉账号的那一环。指纹是作为一整组被评判的,而真正要紧的检查不是「这个值是不是罕见」,而是「这些值描述的是不是一台可能存在的机器」。一个声称 macOS 的 user-agent,旁边配着写着 Windows 的 UA-CH 元数据,描述的不是任何一台真实电脑。一台报告 4K 屏幕、两个 CPU 核心、时区又和自己的出口 IP 差三小时的设备也一样。

给每个环境随机取值只会让情况更糟:你各自独立打乱的字段越多,其中两个互相矛盾的可能性就越大。所以 Argus 把这份身份当成一个整体来生成——每个环境自动生成一套硬件身份,各项之间彼此协调,不会互相矛盾。

  • Windows、macOS 和 Linux 预设,user-agent 与 UA-CH 元数据同步生成、彼此吻合
  • 平台、CPU 核心数、内存、屏幕、时区和语言作为一个自洽的整体一起生成

同一个问题的网络那一半,是会话到达时用的地址,而在浏览器内部,再多的指纹功夫也解决不了它。那是一个环境一个代理要管的事。

浏览器

替换值施加在哪里

大多数防关联工具驱动的是一个不是自己造的浏览器,所以它们唯一能插手的地方是 JavaScript:由扩展或注入脚本把真正的函数换成一个返回别的答案的包装。这一招管用,直到页面去看那个包装本身。一个被重新赋值过的原生函数,转成字符串时不再像原生函数,原型和属性描述符也会变,于是包装自己成了破绽——页面这下知道的不只是你在藏东西,还知道你是那种会藏东西的访客。

Argus 自己构建 Chromium,所以替换发生在比那更低的一层。身份是在页面之下施加的,脚本绕不到它后面去读。

  • 脚本看到的是改写后的值,因为那里就只有这一个值,而不是因为有层包装把真值藏了起来

页面在盘问渲染进程,得到一个答案。

指纹

四种模式,逐面配置

把什么都伪装掉,并不自动就是最安全的设置,所以每一个面都单独配置,而不是由一个总开关决定。

  • 每一项都工作在四种模式之一:真实、噪声、关闭或手动

Real 直接放行机器自己的答案——在你的硬件本就毫不起眼的那些面上,这正是你想要的。Noise 对结果做扰动,让每个环境的哈希都不同,而输出看起来仍像是某块 GPU 产出的东西。Off 让这个面拒绝作答。Manual 钉死你填进去的那个确切值,用于一个环境必须继续报告它上个月报告过的内容时。

指纹

预设、钉值,以及重掷

新环境什么都不用你做就会拿到一份前后一致的身份;编辑器是留给你想自己拿主意的那些部分的。

  • 每个环境都有自己的编辑器,用来把你想亲手钉住的那几项定下来
  • 一键重掷生成新的身份,同时保留你的配置

重掷比听起来重要。当一个环境的身份必须改变时——被标记后重新开始,或者环境要转交给另一个客户——你要的是一份新的硬件身份,外加原来那套代理、Cookie、标签和备注。一次点击就能做到,而不必删掉环境再凭记忆把配置重搭一遍。

验证

自己去查,并且清楚这次检查证明了什么

上面写的全都是论证。这一页所面向的这个市场不靠文章结束争论——它会打开一个检测站。那就这么办:开一个环境,去访问一个,自己读结果。值得花时间的有四个。CreepJS 最严苛,也是唯一一个评的是内部一致性而不是一串值的;Whoer 是圈内人互相引用最多的那个;BrowserLeaks 用来单独看某一个面——canvas、WebGL、音频;Pixelscan 则最紧盯地址和设备对不对得上。

然后诚实地读那个分数,因为分数不是判决。检测站量的是页面能看到的东西,再拿它和自身对照。绿色结果意味着页面能读到的那份身份是自洽的——它不能证明某个具体网站不会标记这个账号,对它够不着的浏览器内部也只字未言。谁要是拿前者向你许诺后者,那是在卖东西。不过本页提到的两种失败,检测站确实抓得到,也值得抓:一个和邻居矛盾的值,以及一个带着你真实地址的 WebRTC 候选。

Argus 把同一套检查做成了一个工具,那是能扩展到一个环境以上的版本。它测的是运行中的环境里,页面实际看到什么——WebRTC 候选、时区、语言、user agent、平台、屏幕、硬件、WebGL 字符串、噪声哈希——再逐项与启动器为该环境声明的身份对分,把对不上的标出来。它在本地 API 上,也是一个智能体工具,所以查两百个环境是一个循环,而不是一个下午。它的局限和上面写的一样,而且它在自己的描述里就这么说,不是塞在脚注里。

老实说

指纹解决不了什么

一份自洽的身份,回答的是网站在你到达时问的三个问题里的一个。它对另外两个毫无作用,而一套在那两个上出错的方案,不管指纹做得多好都会失败。

第二个问题是地址。一个呈现华沙设备、却从法兰克福的机房地址段过来的环境,在页面加载完之前就已经自相矛盾了——网络那一半由代理在 Argus 里如何工作来讲,包括怎么买到能扛住你在意的那些网站的代理。

第三个是状态。两个指纹无可挑剔、彼此又完全不同的环境,只要共用一套 Cookie 存储、一份缓存或一个 Service Worker 注册,那仍然是一个账号——在磁盘上把它们分开的是环境隔离

准备好大规模运行环境了吗?

下载 Mac 或 Windows 版 Argus,免费获得 5 个环境开始使用。