全部文章

WebGL 指纹是什么?网站能从显卡和渲染结果里看到什么

WebGL 不会直接把你的姓名或显卡序列号交给网站,但它会暴露一组和图形环境有关的信号:Vendor、Renderer、支持的能力,以及同一段图形在当前浏览器里的渲染结果。网站把这些信息组合起来,就能得到一组很有价值的浏览器指纹特征。

WebGL 指纹是什么?网站能从显卡和渲染结果里看到什么

我们看浏览器指纹检测结果时,WebGL 往往是最容易让人误解的一项。

页面上可能会出现:

Vendor
Renderer
Unmasked Vendor
Unmasked Renderer
WebGL Report Hash
WebGL Image Hash

再加上一长串看不懂的参数。

很多人看到这里会产生两个完全相反的判断:

“网站是不是已经知道我具体用哪张显卡了?”

或者:

“这不就是一个 Hash 吗,应该没什么用。”

其实都不太准确。

WebGL 真正有价值的地方,不是某一个字段,而是它能让网站看到一组相对稳定的图形环境特征。

这些特征再和 Canvas、字体、Audio、屏幕、系统、时区等信息放在一起,就会成为完整浏览器指纹的一部分。

如果你想先看看自己的浏览器暴露了什么,可以运行 EnvTrace 浏览器指纹检测。下面我们重点讲 WebGL 这一层应该怎么看。

WebGL 指纹到底是什么

WebGL 本来不是为了“识别用户”设计的。

它是一套浏览器图形 API,让网页可以调用设备的图形能力,在 <canvas> 中渲染 2D 和 3D 内容。

网页游戏、3D 展示、地图、数据可视化,都可能用到它。

问题在于:

浏览器为了完成这些图形任务,也需要暴露一部分图形环境信息。

网站可以查询:

  • WebGL 是否可用;
  • WebGL 1 / WebGL 2 支持情况;
  • Vendor 和 Renderer;
  • 支持哪些 WebGL 扩展;
  • 最大纹理尺寸等能力参数;
  • 着色器精度;
  • 一段固定图形在当前环境里的渲染结果。

单独看其中一个字段,通常没有想象中那么“唯一”。

但把很多字段组合起来,识别价值就会上升。

所以我们更愿意把 WebGL 指纹理解成:

浏览器当前图形环境的一组可测量特征。

而不是“网站偷偷读到了显卡身份证”。

网站能通过 WebGL 看到哪些信息

中文内容里经常会把 WebGL 简化成一句:

“网站可以读取你的显卡型号。”

这个说法太粗了。

我们实际看结果时,会把它拆开。

Vendor 和 Renderer

这是最直观的两类字段。

你可能看到与这些名称有关的信息:

  • Intel;
  • NVIDIA;
  • AMD;
  • Apple;
  • ANGLE;
  • SwiftShader;
  • 其他浏览器或图形后端提供的字符串。

但这里有一个很重要的区别:

Renderer 不一定等于你电脑里那张物理显卡的完整、精确型号。

浏览器和操作系统之间可能还有图形转换层,浏览器也可能为了隐私或兼容性对信息做处理。

所以我们看到一个 Renderer 时,更准确的理解是:

这是当前浏览器愿意向网页暴露的图形渲染环境。

它能提供线索,但不应该被当成硬件序列号。

WebGL 支持能力

WebGL 还能暴露很多能力参数,例如:

  • 支持哪些扩展;
  • 最大纹理尺寸;
  • shader precision;
  • 顶点属性上限;
  • WebGL 版本;
  • 深度、颜色和渲染相关能力。

一个参数可能非常常见。

但几十个参数放在一起,组合就会更有区分度。

这也是浏览器指纹常见的思路:

不是寻找一个“世界唯一”的字段,而是把很多普通字段组合起来。

图形渲染结果

网站还可以让 WebGL 渲染一段固定内容,再读取最后的像素结果。

不同环境之间可能因为:

  • GPU;
  • 驱动;
  • 操作系统;
  • 浏览器;
  • 图形后端;
  • 着色器实现;
  • 精度和抗锯齿处理;

产生细微差异。

这些差异对肉眼来说可能完全看不出来,但程序可以计算。

最后,检测工具往往会把结果转换成一个 Hash。

WebGL Hash 到底是什么

这是我们最想解释清楚的一点。

看到:

f83a9c...

这种很长的字符串时,很容易觉得:

“这个就是我的显卡唯一 ID。”

通常不是。

WebGL Hash 更像是:

把检测到的一组 WebGL 数据压缩成一个方便比较的摘要。

例如,一个检测工具可能对:

  • WebGL 参数;
  • 支持的扩展;
  • Vendor / Renderer;
  • 渲染出来的像素;

做组合,然后计算 Hash。

因此有些工具会同时显示:

WebGL Report Hash
WebGL Image Hash

它们可能分别代表:

  • 对 WebGL 参数报告计算的 Hash;
  • 对实际渲染图像计算的 Hash。

Hash 本身不是“藏在显卡里的号码”。

它是网站根据自己测到的数据算出来的。

这个区别很重要。

WebGL 指纹真的唯一吗

不一定。

如果两台电脑:

  • 型号相同;
  • GPU 相同;
  • 操作系统相同;
  • 浏览器版本相同;
  • 驱动和图形配置也很接近;

它们完全可能得到非常接近、甚至相同的 WebGL 结果。

所以我们不会仅仅因为检测页显示:

“WebGL Fingerprint”

就告诉用户:

“网站已经可以唯一识别这台电脑。”

真实情况通常是:

WebGL
+
Canvas
+
Fonts
+
Audio
+
Screen
+
Timezone
+
Browser / OS
+
其他信号

组合以后,整体浏览器才会越来越容易被区分。

换句话说:

WebGL 不需要自己做到唯一,它只需要为完整指纹增加一部分区分度。

如果你想理解这些信号最后是怎么组合起来的,可以看 什么是浏览器指纹

为什么同一块显卡,WebGL 指纹也可能不同

这个问题比“WebGL 能不能查到显卡”更值得关注。

因为 WebGL 最终暴露的是整条图形链路的结果,不是只读取 GPU。

同一块显卡,在不同环境里仍可能受到这些因素影响:

  • Chrome、Firefox、Safari 等浏览器差异;
  • 浏览器版本变化;
  • Windows、macOS、Linux;
  • GPU 驱动版本;
  • 是否启用硬件加速;
  • ANGLE 等图形转换层;
  • 虚拟机或远程环境;
  • 浏览器自身的隐私保护;
  • 指纹浏览器或扩展对参数的处理。

所以:

same GPU ≠ same WebGL fingerprint

反过来也一样。

两个用户看到相同 Renderer,也不能说明他们就是同一台设备。

我们看 WebGL 时,更关心的是一组结果是否稳定,以及它和其他浏览器信息能不能对得上。

WebGL 指纹和 Canvas 指纹有什么区别

这两个经常放在一起说。

它们确实有关系,但不是一回事。

Canvas 指纹

Canvas 指纹通常会让浏览器绘制:

  • 文字;
  • 图形;
  • 颜色;
  • 线条。

然后读取 2D Canvas 的输出差异。

影响结果的因素可能包括字体、系统渲染、浏览器和抗锯齿等。

WebGL 指纹

WebGL 使用的是 WebGL 图形管线。

除了渲染结果,还可以获得更多与图形能力相关的信息:

  • Vendor;
  • Renderer;
  • 支持的扩展;
  • Shader 精度;
  • 图形能力上限;
  • GPU 相关的渲染差异。

所以实际的指纹系统完全可以:

Canvas 也采,WebGL 也采。

它们不是互相替代,而是两个不同的信号来源。

我们怎么看一份 WebGL 检测结果

如果你刚刚跑完检测,不需要先研究几十个 WebGL 参数。

我们一般先看三个问题。

1. Vendor 和 Renderer 是否合理

先看浏览器暴露出来的图形环境。

它是否和你正在使用的设备、操作系统、浏览器大致说得通?

这里不是要求你一定暴露“真实显卡型号”。

我们关心的是:

结果有没有明显自相矛盾。

2. 结果是否稳定

同一个浏览器、同一个环境,重新测试几次。

如果 WebGL Hash 每次刷新都随机变化,确实降低了稳定性。

但“变化越多越安全”也不一定成立。

如果一个普通浏览器本来应该表现稳定,而某个扩展每次都随机制造噪声,这种行为本身也可能变成异常特征。

所以我们更关注:

这个环境有没有一个合理、稳定的行为。

3. WebGL 和其他指纹能不能对上

这是最重要的一层。

例如,一个环境单独看每项都“像真的”:

Browser / OS:环境 A
WebGL Renderer:环境 B
其他硬件信息:环境 C

但放在一起完全不合理。

这种情况可能比“WebGL Hash 是否唯一”更值得关注。

所以 EnvTrace 不会只给用户一个 WebGL Hash 就结束,而是把 WebGL 和 Canvas、Audio、字体等信号放到同一个 浏览器指纹检测 里看。

开 VPN 会改变 WebGL 指纹吗

通常不会因为换了 VPN,就自动换掉 WebGL 指纹。

因为它们属于不同层。

VPN 主要改变:

公网 IP
网络出口
地理位置
ASN / 运营商

WebGL 主要来自:

浏览器
操作系统
GPU
驱动
图形后端

所以你完全可能:

IP 已经从中国变成美国,但 WebGL 仍然和连接 VPN 前一样。

这不叫 VPN 泄漏。

它只说明:

网络身份变了,浏览器图形环境没有跟着变。

如果你想检查 VPN 有没有通过其他网络路径暴露 IP,可以单独运行 WebRTC 泄漏检测

无痕模式会改变 WebGL 指纹吗

通常不会因为开一个无痕窗口,就让图形环境发生根本变化。

无痕模式主要改变的是:

  • Cookie;
  • 本地存储;
  • 历史记录;
  • 会话数据的持久化方式。

但网页仍然运行在同一台设备、同一个浏览器和图形环境里。

所以:

无痕浏览 ≠ 浏览器没有指纹。

这也是为什么浏览器指纹经常被讨论为 Cookie 之外的识别信号。

WebGL 要不要关闭或伪装

我们不建议看到 WebGL 指纹就立刻:

“把 WebGL 关了。”

WebGL 是正常网页能力。

关闭以后可能影响:

  • 3D 页面;
  • 地图;
  • 游戏;
  • 可视化工具;
  • 依赖硬件加速的 Web 应用。

同样,我们也不建议只为了“看起来不一样”,把 Vendor、Renderer、Hash 全部随机修改。

因为单个字段改得再漂亮,如果最后组合成一个现实中很难存在的环境,反而会产生新的问题。

如果你的目标是降低浏览器可识别性,更合理的方法是:

减少不必要的独特性,同时保持整个环境自然、一致。

可以继续看 如何降低浏览器指纹

如果你使用的是指纹浏览器,真正需要看的也不是“WebGL 有没有改”,而是:

WebGL、Canvas、UA、系统、屏幕、时区和网络信息放在一起,是否像同一台真实设备。

最后,我们真正关心的不是一个 Hash

WebGL 指纹很有价值,但它不是完整浏览器身份。

如果我们在检查一个浏览器环境,通常会继续看:

  1. WebGL;
  2. Canvas;
  3. Audio;
  4. 字体;
  5. 屏幕和硬件信号;
  6. 时区与语言;
  7. 公网 IP 和网络;
  8. WebRTC;
  9. 这些信息能不能互相对得上。

所以当你看到一个 WebGL Hash 时,不需要先问:

“它是不是唯一?”

更值得问的是:

这个 WebGL 结果透露了什么?它稳定吗?它和浏览器其他信息是一套合理的环境吗?

你可以先运行 EnvTrace 浏览器指纹检测,看看自己的 WebGL、Canvas 和其他指纹信号放在一起是什么样子。

常见问题

什么是 WebGL 指纹?
WebGL 指纹是网站通过浏览器 WebGL API 获取的一组图形环境特征。它可能包含显卡供应商、渲染器、支持的扩展、图形能力参数以及特定渲染结果。网站可以把这些信息组合或哈希后,作为浏览器指纹的一部分。
WebGL 指纹能直接查到显卡型号吗?
有时可以看到与 GPU 或图形后端相关的 Vendor、Renderer 信息,但它不一定等于物理显卡的精确型号。浏览器、操作系统、ANGLE、虚拟化和隐私策略都可能改变网站最终看到的字符串。
WebGL Hash 是显卡唯一 ID 吗?
不是。WebGL Hash 通常是把浏览器可读取的 WebGL 参数、渲染结果或两者组合后计算出的摘要值。它不是从显卡里读取出来的永久硬件序列号。
WebGL 指纹和 Canvas 指纹有什么区别?
Canvas 指纹通常关注 2D 文字、图形和颜色的渲染差异;WebGL 指纹使用 WebGL 图形管线,还可以结合 GPU、Renderer、扩展、着色器精度和 3D 渲染结果。两者经常一起成为完整浏览器指纹的一部分。
开 VPN 会改变 WebGL 指纹吗?
通常不会。VPN 主要改变公网 IP 和网络出口,WebGL 指纹更多来自浏览器、操作系统、GPU、驱动和图形后端。网络身份和浏览器图形指纹是两层不同的信息。
需要关闭或随机修改 WebGL 吗?
不建议只为了隐藏一个字段就随意关闭或随机修改 WebGL。关闭可能影响需要图形加速的网站,随机伪装也可能制造不自然的参数组合。更重要的是先看完整浏览器环境是否稳定、合理且一致。

看看你的浏览器暴露了哪些指纹信号

运行 EnvTrace 浏览器指纹检测,同时查看 WebGL、Canvas、Audio、字体等信息,不把单个 Hash 当成最终结论。

检测浏览器指纹
继续阅读

相关文章