先搞清楚 WebGL 是什么
WebGL 是浏览器里的一套 JavaScript 绘图接口,让网页不装任何插件就能调用显卡(GPU)画 2D 和 3D 图形。在线地图的三维建筑、网页小游戏、数据可视化里旋转的图表,背后多半都是它。换句话说,WebGL 是网页和你本机硬件之间的一条正常通道——问题也出在这条通道上。
为什么画几个图形就能认出你
同一段绘图指令,交给不同的硬件和软件去执行,结果并不会逐像素完全一致。
显卡型号、驱动版本、操作系统、浏览器实现,各自对浮点运算、抗锯齿、纹理采样、光照的处理方式都有细微区别。网站让浏览器离屏渲染一组固定的图形(常带渐变、纹理和光照),再用 readPixels 把生成的像素读回来。这些像素在肉眼看几乎一样,数值上却带着你这台设备的"口音"。
除了渲染结果,WebGL 还直接暴露一批描述性参数。通过 WEBGL_debug_renderer_info 扩展能读到 GPU 的厂商和型号字符串,例如类似 ANGLE (NVIDIA ...) 的内容;再加上支持的扩展列表、各项数值上限(纹理尺寸、顶点数等),拼在一起就是一份相当详细的硬件画像。
网站把"渲染像素 + 这些参数"揉到一起算出一个哈希值,就是你的 WebGL 指纹。它不依赖 Cookie,你清缓存、开无痕、换账号,这个编号基本不变。
关键点:指纹的威力不在于某一项多独特,而在于多项组合后,和你撞车的人越来越少。
和 Canvas 指纹什么关系
两者是近亲。Canvas 指纹让浏览器画 2D 的文字和图形,读回像素找差异;WebGL 指纹则是调用 GPU 做 3D 渲染,并额外带出硬件参数。
可以这样理解:Canvas 更多反映字体渲染、系统这类软件层面的差异,WebGL 更深入到显卡和驱动这一硬件层面。追踪方往往把它们和时区、语言、屏幕分辨率、音频指纹等一起采集,哪一项都不唯一,合起来却足以稳定地把你从人群里拎出来。
追踪风险在哪
- 无感知、难拒绝。 采集在后台由脚本完成,没有弹窗提示,普通的"清除浏览数据"也删不掉它。
- 跨站拼接。 同一枚指纹在多个站点出现,就能把你在不同网站的行为串成一条线,哪怕你从没登录。
- 多账号关联。 对需要多个独立身份的场景(如运营、测试、跨境电商),同一设备下多个账号共享同一指纹,很容易被判定为"同一个人"而遭关联或风控。
当然指纹并非绝对唯一,硬件和配置相近的人可能"共用"一枚,但这不改变它作为长期追踪手段的价值。
怎么降低暴露面
思路大致三类,各有代价:
- 直接禁用 WebGL。 浏览器里可以关掉(如 Firefox 的
webgl.disabled)。但越来越多正常网站依赖它,关掉可能导致页面功能异常;更要紧的是,绝大多数真实用户都开着 WebGL,一个完全没有 WebGL 的浏览器本身就是一种罕见特征,等于用一个显眼的标记换掉了原来的指纹,往往得不偿失。 - 加噪声。 对读回的像素注入轻微、随机的扰动,让每次计算出的指纹都不同。做得不好会走向另一个极端:每次刷新都在变的指纹同样不自然,还可能被检测到"正在被篡改"。
- 整体伪装成一台自洽的设备。 更稳妥的方向不是"藏起来"或"乱变",而是让 WebGL 参数、渲染特征和 User-Agent、操作系统、其他指纹项彼此吻合,并在你这个身份的多次访问里保持稳定——看起来就是一台普普通通、始终如一的真实电脑。
一句话总结:对抗指纹追踪,目标不是"没有指纹",而是一个合理、自洽且稳定的指纹。 反指纹里最常见的翻车,恰恰是用力过猛造出一个现实中不存在的组合。
对需要长期维护多个独立浏览器身份的人来说,逐项手动调参既繁琐又容易露馅,这也是指纹浏览器这类工具存在的理由——把一整套指纹作为整体来管理,保证自洽和稳定。虎鲸 AI 浏览器是面向这类多账号、防关联场景的一个选择:它的 WebGL 指纹可设置显卡标识并对 readPixels 结果加噪,还要求 WebGL 与 WebGPU 对应同代显卡、避免各项对不上;每个环境的指纹独立而稳定,以降低被关联的概率。