了解浏览器指纹如何通过 Canvas、WebGL、字体与音频信号识别你,并学习用 BrowserInsight 检测、降低指纹追踪,切实保护你的在线隐私。
什么是浏览器指纹?
浏览器指纹(Browser Fingerprinting)是一种通过收集浏览器和设备的各种特征信息来识别和追踪用户的技术。与传统的 Cookie 不同,浏览器指纹不需要在用户的设备上存储任何数据,因此即使用户清除了浏览器数据,网站仍然可以通过指纹信息识别出同一用户——参见持久访客ID:清缓存、开无痕、换VPN也没用,了解为什么清除Cookie、切换无痕模式或更换VPN都无法重置这种方式构建的ID。
浏览器指纹的工作原理
当你访问一个网站时,你的浏览器会自动向服务器发送大量信息,包括:
- User-Agent:浏览器类型、版本、操作系统信息
- 屏幕分辨率:显示器的大小和颜色深度
- 时区:设备的本地时间设置
- 已安装字体:系统中可用的字体列表
- Canvas 指纹:通过 HTML5 Canvas 绘制的图形在不同设备上的细微差异
- WebGL 指纹:显卡和图形驱动程序的信息
- 音频指纹:音频处理器的特征
- 布局几何信息:页面元素与文本位置的亚像素级测量,通过普通 DOM 布局 API(而非 Canvas)读取——参见 ClientRects 指纹
- 媒体设备:通过
enumerateDevices()读取的已连接摄像头、麦克风的数量、ID,以及一旦获得权限后的型号标签——参见媒体设备指纹了解授权前后分别会泄露什么 - 已安装语音:通过
speechSynthesis.getVoices()暴露的操作系统和浏览器文本转语音语音清单,无需任何权限提示——参见语音合成指纹了解该语音清单如何因平台而异 - CSS 媒体查询:样式表决定去请求哪一个资源这件事本身就会泄露信息——
prefers-color-scheme、pointer等偏好与硬件信号,乃至已安装字体,全都不需要一行 JavaScript,参见CSS 指纹:无需 JavaScript 的追踪技术了解它为何能绕过脚本拦截器 - 权限状态:
navigator.permissions.query()能识别约 15 种权限名称中的哪些,以及每种解析为granted、denied还是prompt——全程不会弹出任何对话框;参见Permissions API 指纹了解支持模式与状态向量如何叠加 - 网络信息:通过
navigator.connection读取的粗略连接状态——effectiveType、downlink、rtt、saveData——无需任何权限提示,且仅在 Chromium 上可用;参见Network Information API 指纹了解这些分桶数值如何增加熵,又如何兼作浏览器内核检测
针对浏览器指纹的研究发现,组合足够多的这类特征后,绝大多数浏览器都能被唯一识别。实际上,你的浏览器指纹可能几乎和现实世界中的指纹一样独特。
单看其中任何一项特征都很微弱——和你共用同一屏幕分辨率或时区的人多得是。指纹之所以奏效,是因为这些数值彼此基本独立,组合起来便会成倍放大它们的区分度。用信息论的话说,每一项属性都会增加几比特的熵,一旦组合后的熵超过大约 33 比特,一个浏览器就足以在全球所有人中变得唯一——这一阈值最早由 EFF 的 Panopticlick 研究(Eckersley, 2010)大规模证实,并被 Laperdrix et al. 等后续研究所验证。仅仅是 User-Agent、字体列表、Canvas 和 WebGL 这种常见组合,往往就足以跨过这条线。
WebRTC 是一个相关但独立的风险——而且有两种不同的形式。 它最为人知的问题是一种网络泄露——可能在你使用 VPN 时暴露你的真实 IP 地址。参阅 WebRTC 泄露防护,了解如何检测并堵上这个漏洞。此外,WebRTC 还通过它支持的编解码器和 SDP 结构暴露出一个独立的小型指纹面,与你的 IP 无关——参阅 WebRTC 指纹技术,了解这一信号的原理,以及为什么堵住泄露并不能消除它。
这些信号在每种设备上的权重并不相同。批量生产的手机硬件会压平 Canvas、WebGL 和字体的熵值,远不如桌面 PC 配置那样千差万别——但屏幕几何信息、触控点和运动传感器又带来了桌面设备大多不具备的信号。参阅移动端浏览器指纹识别,了解 Android 和 iOS 设备具体是如何被追踪的。
时区和语言值得特别一提,因为它们不仅是设备信号,同时也是地区信号——想知道你实际连接来自哪个国家的服务,可以将你报告的时区、语言与你的 IP 地理位置进行比对,而只改变 IP 的 VPN 会让这种矛盾暴露无遗。参见应用如何在 VPN 之下识别你的真实地区,了解这项具体检测机制的原理。
Canvas 指纹技术详解
Canvas 指纹是目前最强大的浏览器指纹技术之一。它的工作原理是:
- 网站在隐藏的 Canvas 元素上绘制特定的图形和文字
- 将 Canvas 内容转换为图像数据
- 计算图像数据的哈希值
- 由于不同设备的显卡、驱动程序和浏览器渲染引擎存在细微差异,生成的哈希值也不同
Canvas 指纹的示例代码
// Canvas 指纹采集示例
function getCanvasFingerprint() {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
// 绘制文字和图形
ctx.textBaseline = 'top';
ctx.font = '14px Arial';
ctx.fillStyle = '#f60';
ctx.fillRect(0, 0, 100, 20);
ctx.fillStyle = '#069';
ctx.fillText('BrowserInsight', 2, 15);
// 获取图像数据并计算哈希
return canvas.toDataURL();
}
WebGL 指纹技术
WebGL 指纹利用 WebGL(Web Graphics Library)API 来读取你的显卡硬件细节,以及它渲染 3D 内容的方式。由于不同设备之间的 GPU、驱动程序和渲染管线差异巨大,这些细节属于追踪者所能采集到的最高熵信号之一。
脚本实际上会读取两类截然不同的东西:
1. 上报的参数。 WebGL 通过 getParameter() 暴露出数十个数值——并且借助 WEBGL_debug_renderer_info 扩展,还能拿到未经掩码的 GPU 厂商和渲染器字符串:
const gl = document.createElement('canvas').getContext('webgl');
const dbg = gl.getExtension('WEBGL_debug_renderer_info');
gl.getParameter(dbg.UNMASKED_VENDOR_WEBGL); // 例如 "Google Inc. (NVIDIA)"
gl.getParameter(dbg.UNMASKED_RENDERER_WEBGL); // 例如 "ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 Direct3D11 vs_5_0 ps_5_0, D3D11)"
仅凭这样一个渲染器字符串,就能把你缩小到某个特定的 GPU 系列。再结合最大纹理尺寸、支持的扩展列表、着色器精度范围以及锯齿线宽限制,这套参数本身往往就足以唯一识别你。
2. 渲染输出。 和 Canvas 一样,脚本可以在离屏渲染一个 3D 场景,并对生成的像素计算哈希。浮点运算、抗锯齿和驱动优化上的细微差别,会让这个哈希在你的机器上保持稳定,却又与大多数其他机器不同——即便渲染器字符串被掩码也是如此。
因此,WebGL 指纹通常包含以下信息:
- 显卡厂商和型号(未掩码的渲染器字符串)
- WebGL 渲染器和版本信息
- 支持的 WebGL 扩展
- 着色器精度与数值限制
- 最大纹理与视口尺寸
- 渲染测试场景的哈希值
由于这些数值来自硬件和驱动,而非你能随手切换的设置,WebGL 是最难防护的信号之一。如需更深入的探讨,请阅读 WebGL 指纹深度解析。渲染器字符串在架构层面还与操作系统绑定在一起——例如,Direct3D 后端标识只可能来自 Windows——这也是为什么某些 GPU/系统组合不仅罕见,而是物理上不可能存在,会被立即标记。
如何读懂你自己的指纹
理解自身暴露程度的最好方式,就是看看你自己的指纹。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 可以有效阻止大多数指纹技术。你可以使用 NoScript 等扩展选择性地为可信网站启用 JavaScript。
4. 使用虚拟机或容器
为不同的在线活动使用不同的虚拟机或浏览器容器,可以隔离不同的浏览器指纹,防止追踪者将你的不同在线身份关联起来。
反指纹的悖论
这里有一个值得弄清的陷阱:一种罕见或过度定制的防护手段,可能让你更容易被识别,而非更难。如果你是唯一一个运行着某款特定伪装扩展、又带着一个不寻常 User-Agent 的访客,那么这一组合本身就成了一个鲜明的指纹。这正是为什么 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 隧道。
总结
浏览器指纹是一种强大而隐蔽的追踪技术,它利用浏览器和设备的固有特性来识别用户。了解浏览器指纹的工作原理是保护在线隐私的第一步。通过使用 BrowserInsight 等工具检测你的浏览器指纹,并采取适当的防护措施,你可以更好地控制自己的数字身份。
记住,完全的匿名在互联网上是很难实现的,但我们可以通过了解技术和采取适当的措施来最大限度地保护自己的隐私。
推荐阅读:
- resistFingerprinting 详解:Firefox 与 Tor 反指纹机制
- 指纹一致性:为何信号矛盾会让你被标记
- 移动端浏览器指纹识别:Android 和 iOS 如何被追踪
- WebRTC 泄露防护:VPN 用户的必修课
- WebRTC 指纹技术:编解码器与 SDP 如何暴露你的浏览器
- Canvas 指纹检测:网站如何识别你的设备
- 音频指纹:AudioContext 如何识别你的设备
- 反弹追踪解析:绕开Cookie拦截的重定向追踪术
- 字体指纹:已安装字体如何暴露你
- ClientRects 指纹:亚像素级布局如何成为标识符
- 媒体设备指纹:enumerateDevices 会泄露什么
- 语音合成指纹:已安装语音作为一种信号
- CSS 指纹:无需 JavaScript 的追踪技术
- Permissions API 指纹:权限状态如何追踪你
- Network Information API 指纹:downlink 与 RTT 会泄露什么

