全部文章

隐私与指纹

什么是浏览器指纹?一篇讲明白

网站如何在没有 Cookie 的情况下认出你、哪些信号最关键、为什么一致比独特更重要,以及需要多个身份时这意味着什么。

作者 Mango Team发布于 4 分钟阅读

Cookie 是一张名牌:网站发给你,下次来访你把它亮出来。指纹是你的脸:没人发给你,你摘不下来,见过一次的网站不用问就能再次认出你。这篇讲清这张脸由什么组成、页面能看到多少、网站怎么用它,以及无论你想做一个人还是几个人,各自有什么选择。

一段话的定义

浏览器指纹,是读取浏览器向每个页面暴露的几十项属性(User-Agent、屏幕尺寸、已安装字体、显卡型号、时区、绘制一张图片的精确方式等等),再把它们组合成一个标识的做法。任何单项属性都认不出你,组合起来通常就能,因为另一个访客每一项都和你相同的概率很小。这个标识不存在你的机器上,所以清 Cookie 和开无痕窗口都碰不到它。

指纹里有什么

组例子页面怎么读
身份User-Agent、Client Hints、navigator.platform、厂商请求头和 navigator 属性
硬件屏幕尺寸、CPU 核心数、设备内存、显卡、媒体设备screen、navigator、WebGL、WebGPU
渲染Canvas、WebGL 图像、音频处理、字体、布局矩形、语音合成的声音绘制并测量,然后哈希
区域时区、时差、语言Intl 和 navigator.languages
网络HTTP IP、WebRTC 候选地址、由 IP 推出的位置请求本身,加上 WebRTC
隐私信号Do Not Track、存储行为、自动化标志navigator 和存储 API

这些都不需要权限弹窗。实验室几秒钟就能把它们全部读出来,嵌在页面里的指纹脚本在加载时做的大致就是这件事。

它有多独特?

EFF 在 2010 年做的第一个大规模研究发现,样本中 83.6% 的浏览器,其指纹在收集到的五十万个里是唯一的;启用了 Flash 或 Java 的浏览器中,这个比例是 94.2%。此后可用的属性变多了(Canvas、WebGL 和音频当时都不在研究范围内),浏览器的总量也变多了,所以确切数字会动,但结果的形状没变:对于大多数桌面浏览器,这个组合是有辨识度的。

有两件事会让指纹不那么独特:属于一种非常常见的配置(热门笔记本型号上全新的默认浏览器),或者刻意限制页面能读到的东西。两者都是策略,下文会讲。

为什么你清什么它都在

指纹是算出来的,不是存起来的。网站根据你的浏览器报告的内容计算它,把结果留在自己那边,下次再算一遍。你的电脑上没有任何可以删除的东西。这就是为什么无痕模式改变不了它,清 Cookie 改变不了它,同一台笔记本上的两个 Chrome 用户共享它。

机器变了它才会变:浏览器升级、新的显卡驱动、换了显示器。这些变化缓慢而稳定,正是网站预期的样子。相反,每次刷新都在变的 Canvas 哈希不是机器变了,而是浏览器被改过。

网站实际上怎么用它

「独特」是标题,「一致」才是风控系统据以行动的东西。反欺诈引擎很少在乎你的显卡字符串稀不稀有,它在乎的是显卡和操作系统是否相配、时区和 IP 是否相配、User-Agent 和 Client Hints 是否相配、WebRTC 地址和 HTTP 地址是否相配,以及同一个指纹是否不断出现在不同账号背后。

由此产生三种不同的用法:

  1. 识别。 同一个指纹回来了,网站就把它当作同一个访客,不需要 Cookie。用于统计、反欺诈和付费墙。
  2. 关联。 两个账号共享一个指纹,或者一个指纹加一个 IP,就被当作同一个人。这是多账号运营真正要在意的那一种。
  3. 矛盾。 一个不可能属于任何真实机器的指纹,无论自称是什么,都被当作机器人或被改过的浏览器。
罕见可以活,不可能不行。

一个少见但自洽的浏览器,是众多少见的真实机器之一。一个数值互相矛盾的浏览器在世界上并不存在,而这正是网站被设计出来要注意的东西。

能避开它吗?

有两种诚实的策略,方向相反。

融入人群。 让你的浏览器和尽可能多的其他浏览器长得一样。Tor Browser 是最清楚的例子:它固定窗口大小、字体和许多其他数值,让每个用户看起来都一样,并要求用户不要自定义任何东西。它有效是因为所有人都做同样的事;你一调整窗口大小或装一个扩展,它就失效了,而且它只给你一个身份,不是几个。

做一个具体的人,并且始终如一。 呈现一台完整、合理的机器,让它长期稳定,并且永远不让它的数值互相矛盾。任何需要浏览器看起来像一个正常的、特定的人的场景,用的都是这个办法。推到底,它也是多个身份的办法:每一个身份都是一台自己的、完整、合理、稳定的机器。

行不通的是中间路线:随机化个别数值、只伪造 User-Agent、把 API 一个个关掉。每一种都让你更罕见,更糟的是让你不一致,于是你败在上面第二种用法上,而不是第一种。

看看你自己的指纹

理解这一切最快的办法,是看看你自己的。实验室会为你正在用的浏览器列出上面的每一组信号,显示由此得出的标识,并标出互相矛盾的数值,这和风控引擎做的交叉检查是一回事。

检测你自己的指纹

实验室从你的浏览器读取上面的每一个信号,生成标识,并高亮互相矛盾的行。除了一次 IP 查询,数据不会离开你的浏览器。

打开实验室

Mango Browser 怎么处理指纹

Mango 采用第二种策略,并按环境应用。每个环境是一台完整的机器:Windows 或 macOS 上的 Chrome/Chromium 或 Firefox 身份,User-Agent 与 Client Hints、字体、显卡渲染器、屏幕、核心数和内存全部取自真实硬件会报告的数值,并与所选操作系统保持一致。Canvas、WebGL、音频和布局的噪声按环境设定种子,所以每个环境在环境之间唯一,对自己在每次绘制时相同。

绑定代理后,网络和区域两组信号跟着走:WebRTC 候选地址与出口一致,时区、语言和地理位置可以自动跟随。存储按环境各是一个独立目录。结果正是交叉检查在寻找的东西:每个环境一个自洽的浏览器,环境之间没有任何可供网站关联的共享数值。

参考资料

  1. Eckersley (EFF): How Unique Is Your Web Browser?
  2. W3C: Mitigating Browser Fingerprinting in Web Specifications
  3. MDN: 指纹识别

到指纹实验室看看你的浏览器暴露了什么

继续阅读