WebGL供应商指纹从浏览器的3D图形API读取你的GPU制造商和确切型号名称,构建一个持久的设备标识符——不在你的机器上存储任何内容。你现在就可以在 whatsmy.fyi 上查看你的浏览器暴露了什么。
简短总结
WebGL供应商指纹使用名为 WEBGL_debug_renderer_info 的浏览器扩展读取你的GPU驱动暴露的两个字符串:供应商名称(如 NVIDIA Corporation)和渲染器字符串(如 ANGLE (NVIDIA GeForce RTX 3050 Direct3D11 vs_5_0 ps_5_0))。这些字符串足够具体,可以识别你的GPU型号、驱动后端,有时甚至是驱动版本——这些信息很少改变,无法像Cookie一样被清除。
什么是WebGL供应商指纹?
WebGL供应商指纹是一种浏览器追踪技术,利用 WEBGL_debug_renderer_info 扩展——WebGL规范中内置的调试功能——来提取有关你图形硬件的详细信息。与通过像素级渲染变化推断GPU差异的 Canvas指纹 不同,WebGL供应商指纹直接询问驱动程序:"是谁制造了你,你叫什么名字?"
结果是一对字符串——UNMASKED_VENDOR_WEBGL 和 UNMASKED_RENDERER_WEBGL——标识你的GPU制造商、型号名称、图形后端(Direct3D、Metal、Vulkan或OpenGL),以及通常的驱动版本。这两个值加在一起携带10到15比特的熵,使其成为 浏览器指纹 工具包中信号最高的单个属性之一。
该技术最初是为开发者调试图形性能问题而设计的。它从未被设计为追踪面——然而,由于它暴露了在浏览器会话、隐私窗口甚至操作系统重装后都稳定存在的硬件级标识符,它已成为网络上部署最广泛的指纹信号之一。
WebGL供应商指纹是如何工作的?
提取过程只需几行JavaScript,在不到一毫秒内完成。
第一步——请求调试扩展
脚本在WebGL上下文上调用 gl.getExtension("WEBGL_debug_renderer_info")。大多数浏览器默认暴露此扩展;隐私强化的浏览器可能返回 null 或通用字符串。
第二步——读取供应商和渲染器字符串
扩展可用后,脚本两次调用 gl.getParameter()——一次用于 ext.UNMASKED_VENDOR_WEBGL(如 Google Inc. (NVIDIA)),一次用于 ext.UNMASKED_RENDERER_WEBGL(如 ANGLE (NVIDIA, NVIDIA GeForce RTX 3050 Laptop GPU Direct3D11 vs_5_0 ps_5_0, D3D11))。这些是原始驱动字符串——不是浏览器或操作系统在返回前清理过的值。
第三步——与其他信号结合
渲染器字符串被哈希,并与支持的WebGL扩展、最大纹理大小、着色器精度和其他WebGL参数结合,产生复合GPU指纹。这个组合值远比任何单独的字符串更具唯一性。
// WebGL供应商指纹——追踪脚本如何提取GPU身份
function getWebGLVendorFingerprint() {
const canvas = document.createElement('canvas');
const gl =
canvas.getContext('webgl') ||
canvas.getContext('experimental-webgl');
if (!gl) return { vendor: '不支持', renderer: '不支持' };
// 请求暴露未屏蔽驱动字符串的调试扩展
const ext = gl.getExtension('WEBGL_debug_renderer_info');
if (!ext) {
// 浏览器正在保护你(Brave / Firefox resistFingerprinting)
return { vendor: '已保护', renderer: '已保护' };
}
// 这些字符串直接识别你的GPU品牌和型号
const vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);
const renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);
// 示例输出:
// vendor: "Google Inc. (NVIDIA)"
// renderer: "ANGLE (NVIDIA, NVIDIA GeForce RTX 3050 Laptop GPU
// (0x000025A2) Direct3D11 vs_5_0 ps_5_0, D3D11)"
return { vendor, renderer };
}渲染器字符串是什么样子的?
确切格式取决于你的GPU供应商和操作系统。在基于Chromium的浏览器上,字符串以 ANGLE 为前缀——Chrome的包装原生图形API的转换层。以下是现实中的示例:
| GPU供应商 | 示例RENDERER字符串 |
|---|---|
| NVIDIA(Windows) | ANGLE (NVIDIA, NVIDIA GeForce RTX 3050 Laptop GPU (0x000025A2) Direct3D11 vs_5_0 ps_5_0, D3D11) |
| AMD(Windows) | ANGLE (AMD, AMD Radeon RX 6600 Direct3D11 vs_5_0 ps_5_0, D3D11) |
| Intel(Linux / Mesa) | ANGLE (Intel, Vulkan 1.3.267 (Intel(R) UHD Graphics (TGL GT2) (0x00009A78)), Intel open-source Mesa driver) |
| Apple Silicon | ANGLE (Apple, ANGLE Metal Renderer: Apple M2 Max, Unspecified Version) |
| Apple Silicon (M4) | ANGLE (Apple, ANGLE Metal Renderer: Apple M4 Pro, Unspecified Version) |
渲染器字符串通常编码GPU的内部PCI设备ID(如 0x000025A2),这特定于特定的GPU SKU。这使渲染器字符串不仅对GPU系列唯一,通常对特定产品线变体也唯一。
WebGL供应商指纹有多唯一?
| 发现 | 数值 | 来源 |
|---|---|---|
| GPU渲染器字符串的熵贡献 | 10–15 bits | EFF Cover Your Tracks |
| 前10,000个网站中使用WebGL指纹的比例 | >8% | 普林斯顿网络透明度与问责项目,2020年 |
| 结合13+信号(含WebGL)时的指纹唯一性 | 83–90% | EFF Panopticlick研究 |
| 现代反欺诈供应商追踪的信号数 | 100+ | Fingerprint.com |
| GPU指纹在浏览器重启后的稳定性 | 永久持续直到硬件更换 | DrawNApart GPU指纹研究(arXiv 2022) |
渲染器字符串是最稳定的指纹信号之一——它在浏览器会话、隐私窗口之间不变,甚至在完整操作系统重装后,只要同一GPU和驱动程序仍在位,它也不会改变。其熵值低于完整的Canvas哈希,但其稳定性使其在长期重新识别方面更可靠。
现实中谁在使用WebGL供应商指纹?
欺诈检测平台
Fingerprint(前身为FingerprintJS) 等安全公司将WebGL渲染器字符串作为核心设备身份信号使用。当登录尝试来自其GPU指纹与该账户任何先前会话都不匹配的设备时,会触发风险升级。该信号还用于检测凭证填充机器人,这些机器人通常在虚拟化或无头环境中运行,渲染器字符串返回通用软件光栅化器值而非真实GPU名称。
广告技术和跨站追踪
广告网络将WebGL渲染器字符串与Canvas输出、音频指纹、屏幕尺寸和时区结合,构建在Cookie删除后仍能存活的跨站设备标识符。随着第三方Cookie在主要浏览器中被弃用,WebGL供应商数据在无Cookie受众匹配和频次控制中变得更加重要。
机器人和自动化检测
在容器化或无头浏览器环境中运行的自动化机器人会返回异常的渲染器值——通常是 Google SwiftShader(Chrome的软件后备渲染器)或 Mesa OffScreen。真实的人类设备在正常浏览中几乎从不返回这些值。反机器人系统将这些渲染器字符串标记为高可信度机器人指标,用户通常不知道任何检查已经发生。
付费墙执行
计量文章访问的出版商使用GPU渲染器字符串与Canvas和音频指纹一起,识别清除Cookie以重置文章计数器的回访者。与Cookie不同,渲染器字符串无法被删除——只能被具有主动指纹保护的浏览器隐藏。
WebGL供应商指纹合法吗?
根据GDPR,任何可以合理关联到个人的持久标识符——包括用于重新识别的GPU渲染器字符串——都构成个人数据处理。法国监管机构CNIL明确将浏览器指纹识别列为需要知情同意或狭义合法利益豁免的技术。根据美国CCPA和CPRA,指纹数据被归类为需要退出权的个人信息。
W3C指纹识别指南 将 WEBGL_debug_renderer_info 扩展确认为"高保真指纹向量",并指出浏览器供应商应该在隐私敏感上下文中限制其可用性。一些浏览器供应商已经根据此指南采取了行动——见下方保护部分。
如何保护自己免受WebGL供应商指纹追踪
- Brave Browser(推荐日常使用):Brave内置的Farbling系统按每个会话、每个网站随机化WebGL渲染器和供应商字符串。每个网站收到略有不同的GPU描述,使通过渲染器字符串进行跨站追踪不可靠。无需任何配置。
- Firefox配合
privacy.resistFingerprinting:在about:config中将此标志设为true,Firefox会返回通用的非识别渲染器字符串,而非你真实的GPU数据。Tor Browser默认启用此功能。某些WebGL密集型应用程序(游戏、3D设计工具)启用此功能后可能无法正常工作。 - Firefox
webgl.enable-debug-renderer-info: false:about:config中更有针对性的选项,仅禁用调试扩展——WebGL的其余部分继续正常运行。这在保持与WebGL内容兼容的同时阻止直接的供应商/渲染器查询。 - WebGL指纹防护扩展:Chrome和Firefox均可用,此扩展拦截
WEBGL_debug_renderer_info扩展调用并返回随机化或欺骗的渲染器字符串。适用于需要指纹保护而无需切换浏览器的用户。 - Tor Browser(最强保护):Tor Browser标准化所有WebGL输出,使每个用户返回相同的渲染器数据,完全消除GPU识别。代价是Tor网络覆盖导致速度较慢。
- 完全禁用WebGL:在Firefox中设置
webgl.disabled: true或使用浏览器扩展阻止WebGL,可以防止所有基于WebGL的指纹识别——但会破坏3D网络内容,包括在线游戏、地图和数据可视化。
请注意,VPN对WebGL指纹没有任何影响。你的GPU渲染器字符串从本地浏览器API读取,而非从你的网络连接读取。在 whatsmy.fyi 上检查你的VPN是否真的在隐藏你的IP地址(这是一个独立的问题)。
常见问题
WebGL供应商指纹和WebGL渲染器指纹有什么区别?
它们是同一技术的两个方面。供应商字符串(UNMASKED_VENDOR_WEBGL)识别GPU制造商——通常是NVIDIA、AMD、Intel、Apple或像Google(ANGLE)这样的转换层。渲染器字符串(UNMASKED_RENDERER_WEBGL)识别具体的GPU型号、图形后端,以及通常的驱动版本。两者在同一个API调用中读取;放在一起它们构成WebGL供应商指纹。
隐私浏览模式能隐藏我的WebGL渲染器字符串吗?
不能。无痕和隐私模式防止浏览器保存历史记录和Cookie,但它们不改变浏览器运行的硬件。你的GPU渲染器字符串在隐私模式和普通窗口中完全相同。只有具有主动指纹保护的浏览器——Brave、Tor Browser或开启 privacy.resistFingerprinting 的Firefox——才会返回不同的值。
我能在不更换GPU的情况下更改WebGL渲染器字符串吗?
不能可靠地做到。你无法修改GPU驱动报告给操作系统的字符串,浏览器从驱动读取它。浏览器扩展和隐私设置可以拦截API调用并向网站返回欺骗值——但复杂的指纹系统可能会检测到欺骗值的异常(例如,与任何已知GPU都不匹配的渲染器字符串),并将其标记为使用隐私保护设备,这本身就是一个指纹信号。
WebGL供应商指纹与Canvas指纹有何不同?
Canvas指纹间接推断GPU差异——它绘制一张图像并分析由你的硬件和软件栈引起的像素级渲染变化。WebGL供应商指纹直接查询GPU驱动,读取明确的制造商和型号字符串。Canvas指纹对软件差异(字体、操作系统文本渲染)更敏感;WebGL供应商指纹与硬件身份更直接相关。它们通常一起部署,因为它们捕获设备唯一性的互补维度。查看 Canvas指纹指南 进行详细比较。
VPN能防止WebGL供应商指纹追踪吗?
不能。VPN加密你的流量并屏蔽你的IP地址,但它与浏览器的图形API没有任何交互。你的GPU渲染器字符串从本地硬件读取——而非从你的网络——VPN无法改变它。无论你是通过VPN、代理还是直接连接,WebGL供应商指纹的工作方式完全相同。
无头浏览器返回什么渲染器字符串?
缺少真实GPU的无头浏览器和自动化测试环境通常返回软件后备渲染器:Chromium中的 Google SwiftShader 或Firefox中的 Mesa OffScreen。真实用户设备在正常浏览中几乎从不返回这些值。反机器人系统将它们视为高可信度机器人指标。一些自动化框架尝试欺骗渲染器字符串以避免检测,但欺骗值通常无法通过针对其他WebGL参数的一致性检查。
WebGL供应商指纹与DrawNApart技术有关吗?
它们相关但不同。DrawNApart(arXiv 2022)是一种更高级的GPU指纹技术,通过GPU执行速度的微时序变化来识别设备——可使用无特权的JavaScript测量。WebGL供应商指纹只是读取驱动字符串。DrawNApart可以区分具有相同GPU型号的两台机器,因为各个GPU执行单元的速度略有不同;标准供应商指纹无法做出这种区分。商业指纹平台可能会结合两种方法。
相关文章
- 什么是WebGL指纹?你的GPU如何识别你的浏览器 ——WebGL作为指纹识别面的更广泛指南,包括像素哈希技术
- 什么是Canvas指纹识别?网站如何在不使用Cookie的情况下追踪你 ——2D Canvas渲染差异如何补充WebGL供应商数据
- 什么是浏览器指纹?网站如何在不使用Cookie的情况下追踪你 ——所有指纹信号组合的完整指南
- 什么是音频指纹?AudioContext如何追踪你的浏览器 ——你设备的音频栈如何在WebGL旁边产生持久标识符



