指纹检测页上那一长串字段,网站其实本来就能读到。这里给出六项可以自己动手核对的检查,以及判断环境是否自洽的顺序,并说明为什么各项互相矛盾比某一项不够真实更容易被识别。
打开任意一个指纹检测页面,都会看到一长串字段:UA、屏幕、时区、字体、Canvas 渲染结果、硬件参数。多数人第一眼盯的是「唯一度」那一栏,其实那栏最不重要。真正决定你会不会被多看一眼的,是这些字段彼此之间对不对得上。

网站本来就能读到哪些东西
指纹不是靠 Cookie 存下来的。Cookie 你能删、能禁、能用无痕模式绕开;指纹来自浏览器和设备本身的配置。UA 里带着浏览器类型、版本、操作系统及版本;此外还有已安装的插件、屏幕分辨率与颜色深度、字体列表、时区与首选语言、CPU 类型与 GPU 型号和内存大小、IP 与运营商及连接类型,以及 Canvas、WebGL 这类 HTML5 接口返回的渲染结果。这些字段组合起来就是一个标识符,换 IP、清 Cookie、开无痕,它基本不变。平台拿同一套东西判断账号是否关联,用的是同样的原理。
三项先跟系统对账
User Agent 最值得先看,因为它是浏览器自己在「自我介绍」。在检测页上抄下 UA,再去浏览器设置里核对版本号,在系统设置里核对操作系统版本。如果 UA 声明的系统或内核版本和你机器上的实际情况不一致,或者明显落后于当前主流版本,这就是最容易被抓的破绽。
时区要和出口地区对得上。检测页一般会直接列出当前时区,用一句取时区的脚本也能拿到同一个值;另外找任意一个 IP 查询页看出口归属地。两者指向不同区域时,就要处理。
语言和地区是一组弱信号,但组合起来很有用。看 navigator.language 与 navigator.languages 返回的列表,对照出口地区通行的语言。时区在美国、语言是中文、出口在欧洲,这种组合比任意单项都醒目。
屏幕、网络出口与渲染特征
屏幕与硬件参数看两件事:一是这组数值常不常见,二是它和 UA 声明的设备类型匹不匹配。分辨率、像素比、可用区域、CPU 核心数、内存可以一起看,手机尺寸的分辨率配桌面版 UA,是典型的自相矛盾。
WebRTC 要单独检查,因为它泄露的是真实网络信息。检测页通常单列一项,看有没有返回本机内网地址(192.168 或 10 开头的地址),或者干脆返回了真实的公网出口。已经挂了代理却仍然出现真实地址,说明流量根本没走代理,这一项的优先级最高。
Canvas 和 WebGL 看返回结果稳不稳定、与声明的 GPU 型号是否一致。这里有个细节:同一台机器上并排开几个环境,如果它们返回完全相同的渲染值,比返回一个带噪声的值更容易被串起来。
互相矛盾,比不够真实更显眼
平台并不要求每台设备都独一无二,它要判断的是这套信息像不像一台正常机器发出来的。单项不够「真」,比如某个分辨率不那么常见,通常只是弱信号;而几项之间彼此打架时,判断几乎不需要成本。UA 说是 Windows、字体列表却是 macOS 的字体;时区写美国、语言中文、出口在欧洲;分辨率是手机尺寸、UA 却是桌面浏览器——出现任何一种,前面单项调得再细也没用。自查的顺序因此是先找硬矛盾,再谈参数是否精细。
只想改三处的优先级
WebRTC 泄露排第一,它暴露的是真实网络信息。第二是时区与语言跟出口地区的一致性,这是最容易累积成异常判定的组合。第三是 Canvas 与 WebGL 的处理,避免直接暴露同一台机器的稳定唯一值。
顺带说一句边界:禁用或限制 JavaScript 能挡住一部分采集,但会明显影响网站可用性;隐私浏览器自带一些防护,日常浏览够用,需要长期维持多个互不相关的身份时就显得单薄。
要维持多个环境怎么做
关键不是每次都换一套随机指纹,而是每个环境内部固定下来、环境之间互不相同。用 PurpleMark 为每个账号建一套独立的浏览器环境,把 Canvas 这类参数单独处理,再用检测页逐个环境核一遍自洽性。能通过这轮自查的环境,才值得长期挂着用。
指纹检测说到底只有两个用途:看清自己暴露了什么,确认这套信息内部说得通。唯一度是最不该焦虑的那一项。


