CreepJS、唯一性检测器与厂商匿名度评分可能对同一浏览器给出三种不同结论,因为它们衡量的本就是唯一性、连贯性、厂商综合评分这三件不同的事。
拿同一个浏览器连续跑两个指纹检测工具,你就可能得到两个看起来完全矛盾的答案。一个工具告诉你「40 万分之一」——这个说法听着挺让人安心,实际含义却是:在这个工具的样本里,再没有第二个人和你长得一样;另一个给你打出 62% 的信任分数,并标记了若干不一致之处;第三个则只说你「高度唯一」,再无下文。它们都没有错。只是它们衡量的根本不是同一件事,而「分数」这个词,替这个事实掩盖了太多东西。
核心要点
- 指纹检测工具其实是把三种截然不同的量都塞进了「分数」这个词里:唯一性(你的组合有多罕见)、连贯性(你的各项信号是否自相矛盾),以及厂商匿名度综合评分(由厂商私下定义权重的混合指标)。
- 唯一性是一种信息论意义上的度量,而不是一种「判决」——数值高只说明你更容易被识别出来,不代表你的浏览器有任何损坏或伪造之处。
- 连贯性更接近于测谎:一个完全连贯的浏览器仍可以高度唯一,而一个看起来高度匿名的浏览器,也照样可能过不了连贯性检查。
- 强化浏览器有可能让这两个数字同时朝相反方向变化——这是任何读指纹检测报告的人都最需要知道的一条反直觉事实。
- 就算是两个唯一性检测工具之间也会互相打架,因为每一个都是拿自己那批「自选样本」的访客当分母——罕见度数字的含义永远是「在这个工具的访客里有多罕见」,而不是「在整个互联网上有多罕见」。
- 只读取浏览器 API 的检测,无法把你的时区和你 IP 实际解析到的位置做比对:这项比对需要一台真正看到你这条连接的服务器,因此它天然落在所有「纯浏览器端分数」的范围之外。
同一个词,三种不同的问题
「分数」这个词暗示着一把统一的尺子。但实际上,你遇到的每一个指纹检测都是在回答三个不同问题中的一个,而把它们混为一谈,正是为什么同时打开两个不同检测工具的标签页,会感觉它们说的根本是两个不同的浏览器。
唯一性问的是:在所有被测量过的人当中,有多少人和你拥有完全相同的信号组合?这是一个用信息论来回答的群体统计学问题——关于单个信号「比特」如何合并成一个数字的完整机制,可参见浏览器指纹熵与匿名集详解。如果你想抛开浏览器场景、只看底层数学原理,EFF 自己写的这篇科普短文也值得一读:信息论与隐私入门。
连贯性问的是完全不同的问题:你的浏览器暴露出的各项信号,看起来是否合理地来自同一台真实设备,还是某些地方明显被打过补丁?CreepJS 的测谎模型是最直观的公开范例——它根本不关心你的指纹有多罕见,只关心你的各项属性在多条独立代码路径上是否互相印证。指纹一致性:为何信号矛盾会让你被标记从检测系统的视角讲述了同一个道理:一个声称是 Safari 的 User-Agent,配上一个只可能来自 Windows 机器的 GPU 渲染器字符串,这就是一次连贯性失败,无论这两个值各自有多常见或多罕见。
厂商匿名度综合评分是第三类,也是透明度最低的一类。商业指纹识别产品通常会给出一个单一的百分比或字母等级,用来概括「这位访客看起来有多可信」,其构成往往混合了唯一性、连贯性信号,以及厂商不会公开的专有启发式规则。这种混合权重并没有统一标准——A 厂商的 80% 和 B 厂商的 80%,配方完全不是一回事,因为每家厂商都可以自行定义。任何单一的厂商分数,都应当被当作那家厂商的「观点」,而不是前两者那种意义上的度量。
每种指标能告诉你什么、不能告诉你什么
唯一性告诉你的是,在那些会对你做指纹识别的网站之间,你有多容易被反复认出来——它完全不涉及你的浏览器是否看起来被篡改过。一个完全未经修改的原生浏览器,只要恰好拥有一套不常见但完全真实的硬件与字体组合,也可以在唯一性上得分很高,同时依然完全连贯。高唯一性是一个隐私问题(你容易被追踪),而不是欺诈系统眼中的危险信号。
这里还有一个前提,它能解释两个唯一性检测工具之间的大量分歧:分母永远是这个工具自己测过的那批人,而这批人是「自选」出来的——会专门去跑指纹检测的人,隐私意识远高于普通网民。因此罕见度数字的真实含义是「在这个工具的访客里有多罕见」,而不是「在整个互联网上有多罕见」。同一个丝毫未变的浏览器,在两个熵值检测工具那里拿到两个不同的数字,双方都可能只是如实报告了各自的样本而已。
连贯性告诉你的是各项信号是否能自圆其说,完全不涉及这个组合有多罕见。Firefox 的 privacy.resistFingerprinting(在 Tor 浏览器中始终开启)会让每一个用户都上报同一套标准化的值,这恰恰会把唯一性压低——制造一个庞大而整齐的人群,本就是它的全部设计目标。但这些值是被替换出来的,而不是设备原生的;一个从多条独立代码路径去触碰同一属性的测谎器,往往能看出破绽。于是就出现了这种局面:一个在唯一性检测里接近「匿名」的浏览器,在连贯性报告上照样可能亮红灯。在生产环境的欺诈评分与机器人缓解系统眼中,连贯性失败的分量远高于唯一性,因为一台未经改动的设备很少会以那种特定方式自相矛盾。这里的措辞是「很少」而不是「从不」:隐私功能、企业统一管控的配置,以及冷门或老旧设备,同样会触发真实的连贯性告警——所以连贯性标记应当被当作一条值得追查的线索,而不是一纸判决。
厂商综合评分告诉你的,是这家公司的模型此刻如何权衡它所使用的各项输入——而这套权重可能在产品版本之间悄悄改变,你却毫不知情。它可以作为该厂商视角下的一个粗略参考,但不是一个可以拿去和另一个工具的输出直接比较的通用数字,也无法脱离「这是哪家厂商给出的」这个前提去向别人解释。
反直觉之处:强化浏览器可能让两者背道而驰
正是这个细节,让指纹检测报告显得真正令人困惑,而不只是啰嗦:对浏览器做一次改动,就可能让一个数字上升的同时,让另一个数字下降。
安装一个会伪造或随机化少数几项信号的扩展——比如伪造 Canvas 哈希、给某个 WebGL 参数加抖动——可能会在某次访问时降低你测得的唯一性,因为它当天上报的值恰好更常见。但随机化本身就是连贯性检测能够抓住的一种模式:Canvas 噪声与真实哈希:为什么随机化会弄巧成拙一文解释了为什么「这个 Canvas 值每次刷新都在变」本身就是一个破绽,而且有时比一个稳定但唯一的值更严重。同一个浏览器,在连贯性检测眼中变得更可疑的那一刻,恰恰是它在唯一性检测眼中变得更「常见」的那一刻。
反过来也一样成立。一个完全原生的浏览器——不装任何扩展、全部默认设置、字体就是操作系统自带的那一套——往往在连贯性上得分很高,因为没有任何东西看起来被打过补丁。但「完全原生」在 GPU 型号、已安装字体列表和屏幕几何参数上,本身也常常构成一个相当独特的组合,这反而会把唯一性推高,而不是拉低。没有哪一步改动能可靠地同时改善这两个数字;任何防护手段都必须分别针对这两项指标单独评估,因为一次只报告其中一个数字的检测,展示给你的永远只是半张画面。
所有纯浏览器端检测共有的盲区
到目前为止讨论的每一种工具——唯一性检测器、CreepJS、厂商综合评分——都是在你的浏览器内部给你打分,依据只有 JavaScript 能从浏览器自身 API 读到的东西。这让它们都带有同一个结构性盲区:这套 API 里没有任何一项能告诉脚本,它的连接最终是从哪儿出去的。Intl.DateTimeFormat().resolvedOptions().timeZone 返回的只是浏览器被配置成上报的值,它既说明不了请求走了什么路由,也说明不了对端服务器看到的是哪个 IP。
这项比对——时区、语言与 IP 归属地的比对——是生产环境检测系统最常运行、成本也最低的信号之一,恰恰因为它整个就落在「浏览器属性」这一层之外。一个浏览器完全可以在处于完全不同国家的 VPN 出口节点背后,依然上报一套完全连贯、完全合理的时区与语言组合,而无论你在这个浏览器内部再怎么加大探测力度,都不可能把这处矛盾暴露出来。补上这块缺口需要第二次、服务端侧的观测:查出这条连接实际来自哪个 IP,再拿它和浏览器自称的内容做比对。BrowserInsight 的 VPN/代理检测正是围绕网络侧这一半构建的,而指纹检测也把同一套服务端归属地查询接进了它的一致性判断——这恰恰是一个纯靠浏览器属性给你打分的页面无法自行补上的那味料。
看懂一组结果,而不是追逐某个数字
这篇文章的目的不是教你如何把这些分数刷高——这三个数字之所以存在,是因为它们回答的是三个不同的威胁问题,而不是因为其中一个才是「真正」的分数、其余不过是它的近似值。你该关注哪一个,取决于你实际担心的是什么:
- 担心自己被跨网站追踪和画像?唯一性才是相关的数字——参见浏览器指纹熵与匿名集详解,了解如何解读自己的匿名集。
- 担心自己在正在访问的网站眼中看起来像自动化程序或被伪造过?这时重要的是连贯性,而这正是 CreepJS 以及 Sannysoft 和 CreepJS 这类公开的通过/失败检测页专门用来揭示的东西。
- 因为自己运营的网站用了某家厂商的产品,需要评估这家厂商具体的产品?它的综合评分只有结合该厂商自己关于评分权重的文档才有意义——把它当作这家厂商的观点,而不是一种通用的度量。
单一工具给出的单一数字,从来就不可能同时回答这三个问题。运行 BrowserInsight 的指纹检测,你能看到底层信号被逐项摊开——Canvas、WebGL、字体、TLS、navigator 属性——并与它们汇总出的一致性判断并排呈现,而不是被压缩成一个数字;再搭配 VPN/代理检测,获得纯浏览器端检测无法完成的网络侧比对。
常见问题
哪个指纹检测工具给出的分数才是「正确」的?
没有哪一个,因为它们本来就不是在争相回答同一个问题。唯一性检测器、像 CreepJS 这样的连贯性检测器,以及厂商的专有综合评分,各自衡量的是不同的东西;问哪个「正确」,就像在问温度计和气压计谁给出的天气读数才「正确」一样。
如果我的唯一性分数很高,是不是说明我看起来很可疑?
不是。高唯一性只说明你在多次访问之间容易被识别出来——这是一个隐私问题——而不代表任何东西看起来是伪造或被篡改过的。一个未经修改的原生浏览器,只要拥有一套不常见但完全真实的硬件组合,就完全可以同时既高度唯一,又完全连贯。
我能通过一次改动同时提升唯一性和连贯性分数吗?
很难稳定做到。这两个指标衡量的是不同的东西,一个能改善其中之一的改动——比如把某项信号随机化以降低表面上的罕见程度——同时可能在另一项指标眼中看起来像是连贯性失败,因为随机化本身就会变成一种可被检测出的模式。任何改动都应当分别针对这两项指标单独评估。
为什么没有任何指纹检测能抓出与 VPN 不匹配的时区?
因为这项检查需要把浏览器上报的时区,和服务器实际看到你这条连接来自哪个 IP 拿来比对——而没有任何浏览器 API 会把后者交给页面自己的 JavaScript。这需要一次服务端侧的观测,所以它归 VPN/代理检测这类网络工具管,而不是任何纯靠浏览器属性给你打分的检测能做到的。


