浏览器指纹:网站究竟读取了什么

逐项解读网站收集的各类数值,从 Canvas 和 WebGL 到音频、字体、屏幕和时区,并说明为什么自洽的身份比随机化的身份更好。
浏览器指纹识别,是根据浏览器所报告的数值,而不是它存储的任何内容来识别浏览器的做法。无需任何 Cookie。浏览器只是回答了任何网页都有权提出的问题,而这些回答合在一起,足以独特到可以被再次认出。
被收集的数值
大多数指纹识别脚本读取的都是同样的几个来源。
显而易见的那些
- User-Agent 携带浏览器名称、版本和平台,并随每个请求发出。
- 屏幕会报告宽度、高度、色深、像素比和可用的工作区域。
- 语言和时区包括浏览器报告的区域设置及其计算出的偏移量。
- 硬件提示给出所报告的处理器数量,在某些浏览器上还有大致的内存数值。
渲染相关的那些
人们说到指纹识别时指的就是这些值,因为它们是间接的。网页要求浏览器绘制某样东西,然后精确读回绘制出的结果。
- Canvas 操作会把文字和图形渲染到离屏画布并计算哈希。结果会随图形栈、字体和抗锯齿而变化。
- WebGL 会暴露显卡的厂商和渲染器字符串,以及一个渲染场景的哈希。
- 音频让振荡器经过音频处理图并对输出计算哈希。不同软硬件栈的浮点行为略有差异。
- 字体检测会用候选字体测量文本,并根据哪些测量结果不同来推断安装了哪些字体。
网络相关的那些
- 请求来自的地址,以及地理位置数据库对该地址的描述。
- WebRTC,它可能泄露连接本来不会暴露的地址。
- TLS 和 HTTP 握手字段的顺序与内容,它们因客户端而异。
为什么把每个字段都随机化是错误的直觉
直觉上的防御办法是每次访问都改变一切。这反而适得其反,原因有两个。
第一是矛盾。随机化的字段彼此并不知晓。声称是 Windows 的 User-Agent,旁边却是只出现在 Apple 硬件上的 WebGL 渲染器字符串,这个信号比其中任何单个值都要强。真实的机器是内部自洽的,只有合成出来的机器才会自相矛盾。
第二是不稳定。一个每次访问都报告不同设备的账号,描述的是现实中没有人拥有的东西。随时间保持一致,才是普通用户的样子。
配置文件的身份涵盖哪些内容
| 项目 | 处理方式 |
|---|---|
| User-Agent 与平台 | 一起生成,使声称的平台与周围的值相符 |
| 屏幕与像素比 | 按配置文件固定,取自真实显示器实际会报告的尺寸 |
| 时区与区域设置 | 按配置文件设置,并与其使用的网络线路相匹配 |
| Canvas、WebGL 与音频 | 给予稳定的按配置文件处理,每次打开都相同 |
| 字体 | 按配置文件设定一组字体,与该配置文件所声称的平台一致 |
| WebRTC | 受到约束,不会与配置文件的网络线路相矛盾 |
检查你自己的设置
打开一个配置文件,访问一个指纹检测页面。有几个页面会免费公布它们读取到的值。值得检查的两件事,可能和你预想的不一样:
- 各个值彼此一致吗?平台、字体、显卡字符串和时区应当描述同一台合理的机器。
- 和上次一样吗?关闭配置文件,再次打开,重新加载检测页面。数值在两次打开之间发生变化的配置文件是不稳定的,而稳定性才是关键的属性。
检测页面上的稀有度评分是其中最没用的数字。它是拿你与该页面的访客相比较,而这些访客绝大多数是在测试指纹浏览器的人。


