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

我们看浏览器指纹检测结果时,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 指纹很有价值,但它不是完整浏览器身份。
如果我们在检查一个浏览器环境,通常会继续看:
- WebGL;
- Canvas;
- Audio;
- 字体;
- 屏幕和硬件信号;
- 时区与语言;
- 公网 IP 和网络;
- WebRTC;
- 这些信息能不能互相对得上。
所以当你看到一个 WebGL Hash 时,不需要先问:
“它是不是唯一?”
更值得问的是:
这个 WebGL 结果透露了什么?它稳定吗?它和浏览器其他信息是一套合理的环境吗?
你可以先运行 EnvTrace 浏览器指纹检测,看看自己的 WebGL、Canvas 和其他指纹信号放在一起是什么样子。