了解浏览器指纹如何通过 Canvas、WebGL、字体与音频信号识别你,并学习用 BrowserInsight 检测、降低指纹追踪,切实保护你的在线隐私。
什么是浏览器指纹?
浏览器指纹(Browser Fingerprinting)是一种通过收集浏览器和设备特征来识别、追踪用户的技术,而不是在设备上存储任何标识符。W3C 官方的指纹识别指南划出了一条标准组织判断"该不该管"时会用到的分界线:被动指纹读取的是浏览器自动暴露的信息,例如请求头和屏幕尺寸;主动指纹则需要脚本主动去探测某个 API——Canvas、WebGL、AudioContext——并观察它的响应。(更简短的定义可参见 MDN 的指纹术语条目。)这条界线之所以重要,是因为它决定了浏览器厂商能把哪些信号挡在权限提示之后,又有哪些信号是平台默认行为的一部分、天然就暴露在外。与传统的 Cookie 不同,浏览器指纹不需要在用户的设备上存储任何数据,因此即使用户清除了浏览器数据,网站仍然可以通过指纹信息识别出同一用户——参见持久访客ID:清缓存、开无痕、换VPN也没用,了解为什么清除Cookie、切换无痕模式或更换VPN都无法重置这种方式构建的ID。
浏览器指纹的工作原理
当你访问一个网站时,你的浏览器会自动向服务器发送大量信息,包括:
- User-Agent:浏览器类型、版本、操作系统信息
- 屏幕分辨率:显示器的大小和颜色深度
- 时区:设备的本地时间设置
- 已安装字体:系统中可用的字体列表
- Canvas 指纹:通过 HTML5 Canvas 绘制的图形在不同设备上的细微差异
- WebGL 指纹:显卡和图形驱动程序的信息
- 音频指纹:音频处理器的特征
- 布局几何信息:页面元素与文本位置的亚像素级测量,通过普通 DOM 布局 API 读取——参见 ClientRects 指纹
- 媒体设备:通过
enumerateDevices()读取的摄像头、麦克风数量、ID,以及获得权限后的型号标签——参见媒体设备指纹 - 已安装语音:通过
speechSynthesis.getVoices()暴露的文本转语音清单,无需任何权限提示——参见语音合成指纹 - CSS 媒体查询:
prefers-color-scheme等偏好、硬件信号与已安装字体,全都不需要一行 JavaScript 就能泄露——参见CSS 指纹 - 权限状态:
navigator.permissions.query()识别哪些权限名称、每种解析为granted/denied/prompt,全程不弹窗——参见Permissions API 指纹 - 插件列表:
navigator.plugins如今已被规范写死为两种固定状态之一,但与navigator.pdfViewerEnabled或声称的浏览器身份对不上,依然会暴露自动化与篡改——参见navigator.plugins 指纹 - 网络信息:通过
navigator.connection读取的粗略连接状态(effectiveType、downlink、rtt),仅 Chromium 可用——参见Network Information API 指纹 - 键盘布局:通过
navigator.keyboard.getLayoutMap()读取的操作系统键盘物理布局,仅 Chromium 可用——参见键盘布局指纹 - 电池状态:曾可无权限提示读取的电量与充放电时间估算——Firefox、Safari 在再识别研究曝光后先后放弃支持;参见Battery Status API
- HTTP 请求头:
Accept、Accept-Language、Accept-Encoding请求头,早在任何 JavaScript 执行前就已被读取——参见无需 JavaScript 的指纹识别
针对浏览器指纹的研究发现,组合足够多的这类特征后,绝大多数浏览器都能被唯一识别。实际上,你的浏览器指纹可能几乎和现实世界中的指纹一样独特。
单看其中任何一项特征都很微弱——和你共用同一屏幕分辨率或时区的人多得是。指纹之所以奏效,是因为这些数值彼此基本独立,组合起来便会成倍放大它们的区分度。用信息论的话说,每一项属性都会增加几比特的熵,一旦组合后的熵超过大约 33 比特,一个浏览器就足以在全球所有人中变得唯一——这一阈值最早由 EFF 的 Panopticlick 研究(Eckersley, 2010)大规模证实,并被 Laperdrix et al. 等后续研究所验证。仅仅是 User-Agent、字体列表、Canvas 和 WebGL 这种常见组合,往往就足以跨过这条线。参见《浏览器指纹熵与匿名集详解》,了解这些比特是如何相加的,以及由此产生的"1 比 N"匿名集究竟意味着什么。
WebRTC 是一个相关但独立的风险——而且有两种不同的形式。 它最为人知的问题是一种网络泄露——可能在你使用 VPN 时暴露你的真实 IP 地址。参阅 WebRTC 泄露防护,了解如何检测并堵上这个漏洞。此外,WebRTC 还通过它支持的编解码器和 SDP 结构暴露出一个独立的小型指纹面,与你的 IP 无关——参阅 WebRTC 指纹技术,了解这一信号的原理,以及为什么堵住泄露并不能消除它。
这些信号在每种设备上的权重并不相同。批量生产的手机硬件会压平 Canvas、WebGL 和字体的熵值,远不如桌面 PC 配置那样千差万别——但屏幕几何信息、触控点和运动传感器又带来了桌面设备大多不具备的信号。参阅移动端浏览器指纹识别,了解 Android 和 iOS 设备具体是如何被追踪的。
时区和语言值得特别一提,因为它们不仅是设备信号,同时也是地区信号——想知道你实际连接来自哪个国家的服务,可以将你报告的时区、语言与你的 IP 地理位置进行比对,而只改变 IP 的 VPN 会让这种矛盾暴露无遗。参见应用如何在 VPN 之下识别你的真实地区,了解这项具体检测机制的原理。
Canvas 指纹技术详解
Canvas 指纹在隐藏的 <canvas> 元素上绘制文字与图形,读取渲染后的像素并计算哈希——不同设备的 GPU、驱动和渲染引擎的细微差异,会让完全相同的绘制代码产生不同的哈希值。它至今仍是使用最广泛的指纹信号之一,因为它不需要任何权限提示,且只需几毫秒即可完成。关于最大化熵值的具体绘制操作、实际示例代码,以及如何读懂自己的 Canvas 哈希,参见Canvas 指纹检测:网站如何识别你的设备。
WebGL 指纹技术
WebGL 指纹从你的 GPU 读取两类不同的东西:数十个上报参数——包括借助 WEBGL_debug_renderer_info 扩展拿到的未掩码 GPU 厂商与渲染器字符串——以及一次离屏渲染测试场景后计算出的像素哈希,它会随驱动层面的浮点运算和抗锯齿差异而变化。由于两者都来自硬件和驱动,而非你能随手切换的设置,WebGL 是最难防护的信号之一;渲染器字符串甚至能暴露操作系统——例如 Direct3D 后端标识只可能来自 Windows——这正是为什么某些 GPU/系统组合不仅罕见,而是物理上不可能存在,会被立即标记。完整的 API 讲解、示例代码与防护方案,参见 WebGL 指纹深度解析。
平台层面发生了什么变化
指纹面并非一成不变——浏览器厂商多年来一直在收窄它,但走的是两条截然不同的路线。你用的浏览器走哪条路线,决定了脚本还能从你这里读到什么,因此值得先弄清自己站在哪一边。
Chromium:削减被动暴露面,其余的交给授权
User-Agent Reduction(UA 精简) 把每次请求默认发送的 User-Agent 字符串精简成一个低细节的存根,冻结了次版本号,并去掉了原本无需任何脚本运行就能读到的操作系统/设备细节。具体哪些字段被冻结,参见 Chrome 官方的 User-Agent Reduction 文档;对这些变化在伪装检测上的影响,参见我们对这项变化的详细拆解。原本藏在被动 UA 字符串里的细节并没有消失——它被搬到了 User-Agent Client Hints 背后,这是一个需要网站主动请求、而非自动收到的选择性加入(opt-in)API。这也是 Chrome Privacy Sandbox 计划的大方向:把指纹识别面当作需要主动抑制或用权限挡住的东西,而不是任其被动广播。同样要强调,这是 Chromium 的方向,并非整个 Web 的方向。
Firefox 与 Safari:拦掉脚本,统一答案
Firefox 和 Safari 都没有实现 User-Agent Client Hints,也都不认为"让网站主动来要"就是解法。Mozilla 的思路是拦住采集方,而不是改造信号本身:Firefox 的增强型跟踪保护(ETP)默认拦截已知指纹脚本名单上的脚本;而 privacy.resistFingerprinting 则留给那些想要 Tor Browser 那套更严格做法——直接交回统一数值——的用户。Apple 把立场直接写进了 WebKit 跟踪防护政策:该文件把指纹识别归类为"无状态追踪",承诺 WebKit 会尽力阻止一切隐蔽追踪,并补充道,如果某项技术无法被彻底阻止,WebKit 就会通过"减少可用的熵比特数"来限制它——正是上文那套比特计算,被写成了厂商政策。
由此带来的实际结果是:"我到底有多容易被识别?"并没有唯一答案,因为这个答案属于某一个具体的浏览器,而不属于你本人。这也正是为什么它只能实测,不能靠猜。
如何读懂你自己的指纹
理解自身暴露程度的最好方式,就是看看你自己的指纹。BrowserInsight 的指纹检测完全在你的浏览器中运行——任何指纹数据都不会被发送到服务器(IP 查询由一个独立的工具处理)——并会向你展示:
- 你的 Canvas 和 WebGL 哈希值,以及它们看起来是常见还是罕见
- 你完整的 WebGL 渲染器字符串,以及它所揭示的 GPU
- 检测到的音频指纹特征
- 追踪者所能读取的全部请求头和 JavaScript 暴露属性
- 一个匿名化评分,估算你当前配置的独特程度,并给出具体建议
先在你日常使用的浏览器里跑一次检测,然后再换用隐私浏览器或启用某个扩展后再跑一次,比较两次的评分。这种前后对比,是看清哪些防护手段对你的设备真正起作用的最快办法——因为答案会因机器而异。如果想要一套结构化、逐项对照的比较方法,可参见浏览器指纹一致性自查清单。
如何保护你的浏览器指纹
没有哪一个开关能让你瞬间匿名,而现有的防护手段遵循着两种截然相反的理念:让自己看起来和所有人一样(统一化),或让自己每次都看起来不同(随机化)。弄清一款工具采用的是哪一种,能帮你避免把它们以适得其反的方式组合在一起。
1. 使用隐私保护浏览器
Tor 浏览器采用统一化思路:它统一了屏幕尺寸、字体、Canvas 和 WebGL 的输出,让所有 Tor 用户看起来几乎一模一样,把你放进一大群彼此相同的人当中,而不是任由你在人群中显眼。Brave 则采用随机化思路——它的「farbling」会向 Canvas、WebGL 和音频读数注入微小的噪声,这种噪声按站点、按会话分别生成,因此每个站点看到的值各不相同,而且这些值会在不同会话之间发生变化。Firefox 提供了 privacy.resistFingerprinting(RFP),借鉴了 Tor 的统一化技术,并且在 Tor Browser 中默认就是开启的。它们以不同的方式降低可指纹性,但都有一个关键的共同点:改动那些高熵的渲染信号——而这恰恰是最要紧的地方。
2. 使用浏览器扩展
有一些浏览器扩展可以帮助抵御指纹追踪:
- CanvasBlocker:阻止或伪装 Canvas 指纹
- Privacy Badger:自动阻止追踪器
- uBlock Origin:阻止广告和追踪脚本
不过要有所甄别:扩展运行时对你访问的每个页面都拥有广泛的权限,一个粗心或恶意的扩展本身就可能沦为追踪载体。在安装任何新扩展之前,请先阅读 浏览器扩展的隐私风险。
3. 禁用 JavaScript
禁用 JavaScript 能一次性拿掉全部主动信号——Canvas、WebGL、音频和字体探测都得靠脚本才能跑起来——代价是大量网页功能随之失效。你可以使用 NoScript 等扩展,按站点重新放行。但要注意它管不到什么:被动那一层原封不动。你的 HTTP 请求头早在任何一行脚本执行之前就被读走,而仅凭 CSS 依然会泄露偏好设置、硬件特征和已安装字体。关掉 JavaScript 只是缩小了你的指纹,并不能把它抹掉。
4. 使用独立的虚拟机
虚拟机改变的是那些最强信号真正的来源层:不同的客户机操作系统、GPU 驱动栈、字体集合与屏幕几何,会产生货真价实不同的 Canvas 哈希与 WebGL 渲染器字符串,因此不同虚拟机里的活动很难被关联到一起。
浏览器容器和多份浏览器配置文件在这里常被误解:它们隔离的是存储——Cookie、localStorage、站点数据——这对基于 Cookie 的追踪确实是有效防护,但对指纹毫无作用。你的 GPU、字体、屏幕和时区在每个容器里都完全相同,因此指纹脚本在所有容器中看到的都是同一台设备。容器是用来隔开登录状态的,不是用来隔开身份的。
反指纹的悖论
这里有一个值得弄清的陷阱:一种罕见或过度定制的防护手段,可能让你更容易被识别,而非更难。如果你是唯一一个运行着某款特定伪装扩展、又带着一个不寻常 User-Agent 的访客,那么这一组合本身就成了一个鲜明的指纹——这正是 EFF 的 Cover Your Tracks 工具所揭示的同一种权衡:隐私扩展有时反而会让唯一性评分变差而非变好;原因和该评分究竟衡量什么,参见Cover Your Tracks 唯一性分数说明不了什么。这正是为什么 Tor、Firefox RFP 这类统一化工具会努力把你塞进一个庞大且彼此相同的人群中,而不是把你变得与众不同——也是为什么堆叠大量定制化的小调整,往往弊大于利。作为一条经验法则,宁可选用隐私浏览器久经检验的默认配置,也不要手工拼凑一套扩展。反检测浏览器——整体替换指纹配置文件的工具——将这一悖论推向了极端:伪造模式本身也会成为特征,详见网站如何检测反检测浏览器和指纹伪造。想了解检测系统具体依赖哪些信号——TLS、Canvas 噪声、字体、UA-CH 等——来分辨伪造配置文件与真实设备,参见反检测浏览器 vs 真实浏览器:检测系统能看到的 12 个信号。
浏览器指纹的合法用途
虽然浏览器指纹常被用于广告追踪,但它也有合法的用途:
| 用途 | 说明 |
|---|---|
| 安全防护 | 检测账户异常登录,防止欺诈 |
| 反爬虫 | 识别和阻止自动化程序 |
| 用户体验优化 | 根据设备特性优化网页显示 |
| 版权保护 | 追踪内容泄露来源 |
其中反爬虫是技术上最为复杂的一类——参阅 机器人检测技术,了解网站如何把自动化流量与真实访客区分开,而它们所依赖的,往往正是同一批指纹特征。
常见问题
浏览器指纹和 Cookie 是一回事吗?
不是。Cookie 是存储在你设备上的小文件,你可以查看、屏蔽或删除它们。而指纹是从你的浏览器和设备特征中推导出来的——你这一侧什么都没存储,因此清除 Cookie 或换用一个全新的浏览器配置文件都无法重置它。这正是指纹比基于 Cookie 的追踪更难摆脱的原因。另一种技术——反弹追踪——则用完全不同的方式绕开 Cookie 拦截:借助一次重定向,让追踪者自己的域名短暂变成第一方,全程不涉及你设备的任何特征。还有一种不依赖Cookie的手法藏在HTTP缓存本身里:参见ETag与缓存超级Cookie,了解服务器如何把普通的缓存重新验证变成一个追踪标识符。
隐身或无痕模式能阻止指纹采集吗?
大多数情况下不能。无痕模式会阻止浏览器在本地保存历史记录、Cookie 和站点数据,但它并不会改变指纹所依赖的那些特征——在无痕窗口里,你的屏幕尺寸、字体、Canvas 输出和 GPU 看起来都一模一样。网站往往依然能在你的普通会话和无痕会话之间认出你。有些网站甚至能直接判断出你正处于无痕窗口——这背后依赖的存储 API 技巧,可参阅网站如何检测隐身与无痕浏览模式。
浏览器指纹中哪一部分最具识别性?
这要视情况而定,但渲染类信号——Canvas 和 WebGL——通常是最难改变的,因为它们来自你的 GPU 和驱动,而不是某个你能随手切换的设置。这也使它们成为防护手段最值得针对的目标:拦截或随机化 Canvas 与 WebGL 的输出,比调整你的 User-Agent 或时区能去除更多独特性。BrowserInsight 会显示在你自己的浏览器中哪些信号贡献最大,让你清楚把精力花在哪里最值得。
VPN 能阻止浏览器指纹吗?
不能。VPN 会改变你的 IP 地址和表面所在地,但指纹是从你的浏览器和设备计算出来的,而非你的网络——无论用哪个 IP,你看起来都一模一样。VPN 确实有助于解决基于 IP 的追踪和 WebRTC 泄露这两个独立的问题,但它对指纹本身无能为力。还有一种值得了解的相关但不同的技术:TLS 指纹识别——它通过 TLS 握手而非浏览器 API 来识别你的客户端软件,同样能穿透 VPN 隧道。
总结
浏览器指纹是一种强大而隐蔽的追踪技术,它建立在你的浏览器和设备特征之上,而非任何存储在设备上的数据。了解它的工作原理——以及哪些信号真正起决定性作用——是掌控自身暴露程度的第一步。互联网上要做到完全匿名很难,但上述防护措施已经能让你走出很远,而哪一项真正起了作用,只有实测才知道。不妨从一次免费的指纹检测开始——它完全在你的浏览器中运行,不向服务器发送任何数据,几秒钟就能出结果。
推荐阅读:
- resistFingerprinting 详解:Firefox 与 Tor 反指纹机制
- 指纹一致性:为何信号矛盾会让你被标记
- 移动端浏览器指纹识别:Android 和 iOS 如何被追踪
- WebRTC 泄露防护:VPN 用户的必修课
- WebRTC 指纹技术:编解码器与 SDP 如何暴露你的浏览器
- Canvas 指纹检测:网站如何识别你的设备
- 音频指纹:AudioContext 如何识别你的设备
- 反弹追踪解析:绕开Cookie拦截的重定向追踪术
- 字体指纹:已安装字体如何暴露你
- 键盘布局指纹:getLayoutMap 信号
- ClientRects 指纹:亚像素级布局如何成为标识符
- 媒体设备指纹:enumerateDevices 会泄露什么
- 语音合成指纹:已安装语音作为一种信号
- CSS 指纹:无需 JavaScript 的追踪技术
- Permissions API 指纹:权限状态如何追踪你
- Network Information API 指纹:downlink 与 RTT 会泄露什么
- Battery Status API:一堂隐私警示课

