浏览器指纹测试
显示浏览器的唯一指纹信息。
These attributes are read locally to show what your browser reveals. Nothing is sent or stored.
概述
基于 cookie 的追踪必须在你的设备上存点东西,这意味着你能看见它、拒绝它、删除它。 指纹技术什么都不用存:网站读取你的浏览器按设计就会暴露的一批属性,把它们组合起来, 再把这个组合当作标识符。
这个页面展示其中的十一项属性。每一项都用普通的浏览器 API 读取,没有任何一项会弹出 权限请求,也没有任何一项被 cookie 同意横幅所覆盖。
使用方法
打开页面即可。这些值在加载时读取。把它们跟同一台机器上的另一个浏览器、或者另一台 设备上的同一个浏览器对比,就能看出哪些部分标识机器、哪些部分标识浏览器。
每项属性各自贡献了什么
| 属性 | 它能缩小什么 |
|---|---|
User-Agent | 浏览器、主版本号、OS 系族。各家浏览器正在有意逐步削减它 |
Language | 首选语言和地区。在非常见区域设置下具有很强的识别性 |
Platform | OS 系族。在现行浏览器中正被冻结或移除 |
Timezone | 地区。与语言组合后常常能缩小到一个国家 |
Screen | 分辨率和设备像素比。不常见的分辨率识别性极高 |
Color depth | 几乎总是 24-bit。几乎不贡献任何信息 |
CPU cores | 硬件档次。常见取值只有很小的一组 |
Device memory | 硬件档次,由浏览器粗粒度分桶后给出 |
Touch points | 区分触屏设备与桌面设备 |
Cookies enabled | 一个比特,而且答案几乎总是「是」 |
Canvas signature | GPU、驱动、已安装字体和栅格化。这里单项识别性最强的值 |
值得注意的规律是:越是能轻易读到的属性,贡献越小;而唯一那个必须真的渲染一遍才能 得到的属性,贡献最大。这就是为什么商业指纹服务真正依赖的是 canvas、WebGL 和音频 指纹。
属性是怎么变成身份的
每项属性都在切分人群。如果全部访客里有一半用 Windows,那么知道你的平台就把候选者 减半——一个比特的信息。色彩深度几乎切不掉任何人,所以它携带的信息接近零。而一个 canvas 签名能把人群切成上千组,因此它携带的比特很多。
比特是可以相加的。大约 33 个比特就足以在约 86 亿人中区分出一个人,而一个浏览器暴露 的总量远超 33 个比特——这既是指纹技术之所以有效的原因,也是为什么去掉任何单独一项 属性都收效甚微。
这还解释了一个反直觉的结果:把浏览器弄得与众不同,反而让你更容易被识别。一个罕见 的 User-Agent、一个不常见的分辨率、或者一个报出不可能组合的伪装扩展,都是在增加比特 而不是减少比特。融入人群胜过标榜特殊。
真正有效的对策
按效果排序,实话实说:
- Tor Browser。 它把泄露最多的那些值统一化——窗口尺寸被量化,canvas 读取被 阻止或需要确认,时区固定为 UTC。它的用户是刻意做到彼此完全一致的。
- 开启保护的 Safari 和 Firefox。 两者都会随机化或阻止 canvas 和音频读取, Safari 还会报告一个精简后的 User-Agent。两者都没有消除这个攻击面,但都去掉了 价值最高的那部分比特。
- 除此之外基本没别的。 屏蔽 cookie、隐私浏览、清除历史,针对的全都是存储,而 这些值一个都不存储。
伪装类扩展值得单独点出来,因为它们经常起反作用。从一台 canvas 输出看起来像 macOS 的机器上报告一个 Windows 的 User-Agent,制造出的这种不一致本身就是显著特征。
示例
- 让别人明白 cookie 横幅并不是故事的全部。 在屏蔽 cookie 的状态下把这个页面给 他们看。
- 理解只影响部分用户的 bug。
Screen、Language和Timezone是绝大多数「只在 我这台机器上出现」的布局与日期格式反馈背后的变量。 - 检验你的隐私配置究竟改变了什么。 分别在启用和不启用你那些扩展与设置的情况下 对比这些值,注意有多少项根本没动。
- 解释为什么封禁跟着你走。 在你换了 IP、清空了配置文件之后,网站正是靠指纹认出 回访者的。
说明
浏览器不肯提供的值会显示为 —,而不是猜一个。deviceMemory 在 Firefox 和 Safari
上按设计就不可用,platform 则正在各家浏览器中被冻结或移除,所以这里的一道横线是
浏览器在保护你,不是功能失败。
canvas 签名取的是编码后图像数据的最后十六个字符,不是密码学哈希。它在同一台设备上 稳定,在不同设备之间不同;它在这里只是对该技术的一个示意,不是什么规范化标识符。 一个会随机化 canvas 读取的浏览器每次访问都会给出不同的值——那正是防御在起作用。
读取这些属性对正当用途来说同样是不可避免的——响应式布局需要屏幕尺寸,日期格式化需要 时区。问题不在于这些 API 存在;问题在于「为了识别而读取」与「为了渲染而读取」在技术 上无法区分。
这里有两类属性的读取方式与其余不同。Canvas signature 必须真的渲染,因此一个阻止或
随机化 canvas 读取的浏览器会改变它;其余都是普通的属性读取,除非破坏正当用途,否则
无法拦截。正是这种不对称,让浏览器的防御把火力放在 canvas、音频和 WebGL 上,而不是
去试图隐藏屏幕尺寸。
同一个问题的网络那一半,见 IP 查询——地址和指纹是互补的,一个同时 拿到两者的网站,并不需要其中任何一个保持稳定。