从一张看不见的图说起
浏览器里有个叫 <canvas> 的元素,网页可以用 JavaScript 在上面画图:写几行文字、画一段渐变、加一点阴影。平时它用来做图表和游戏,但同样的能力也能被用来识别设备。
做法很简单:网站让你的浏览器在后台画一张你根本看不到的小图,通常是一行带特效的文字,然后把画好的像素读回来,算成一串哈希值。
关键在于,同样一段绘图指令,在不同设备上画出的像素并不完全一样。于是这串哈希就成了设备的一个特征码。整个过程不写入任何文件,也不请求授权,你不会有任何感知。
为什么同样的代码会画出不同的结果
差异来自渲染这条链路上的每一环都可能不同:
- 操作系统与字体:系统自带的字体、字体的微调(hinting)和回退字体不一样,同一个字的边缘像素就不同。
- 显卡与驱动:很多绘制走 GPU 硬件加速,不同显卡、不同驱动版本对抗锯齿和浮点运算的处理有细微差别。
- 浏览器与版本:渲染引擎的实现细节,以及图像编码(比如转成 PNG 时)的方式都会留下痕迹。
这些差别单看都极小,往往只是某些像素差了一两个灰度值,肉眼完全看不出。但把它们压成哈希后,差一个像素,哈希就整个变样。结果就是:配置相近的两台机器很可能算出相同的值,而配置稍有不同的机器就会被区分开。
Canvas 指纹不是给每台设备发一个唯一 ID,而是用"渲染结果"这个侧面,把设备归进一个足够小的群体。它单独不一定够精确,配合别的信号就很有威力。
网站拿它来做什么
单靠 Canvas 指纹,通常还不足以锁定唯一一个人。它真正的用法是和其他信号拼在一起:屏幕分辨率、时区、语言、已装字体列表、WebGL 信息、音频指纹等等。每一项都在缩小范围,拼到一起就可能定位到具体设备。
和 Cookie 比,它的麻烦之处在于:你清掉 Cookie、开无痕模式,Canvas 指纹依然在那里,因为它不依赖本地存储,而是设备本身的渲染特征。这让它成了跨会话、跨"换个马甲"场景下的追踪手段。
谁会受影响
对普通用户,它主要意味着更难摆脱的广告追踪和行为画像——即便你从不登录,也可能被持续识别。
对多账号运营者(电商、社媒、广告投放、联盟营销等),风险要具体得多。这类平台用指纹判断"多个账号背后是不是同一个人、同一台机器"。如果几个账号共享同一个 Canvas 指纹,很容易被判定为关联,轻则限流,重则批量封号。这正是防关联浏览器要解决的核心问题之一。
几种降低被识别的思路(以及常见的坑)
思路一:加噪声。 在读取像素前,对 canvas 结果注入细微、随机的扰动,让每次算出的哈希都不同。这是目前比较主流的方向,但要注意两点。
别过度随机。 如果每次刷新页面指纹都在变,这本身就是异常——真实设备的 Canvas 指纹是稳定的。忽稳忽变反而像是在刻意伪装,更容易被标记。理想状态是:同一个身份对外呈现一个固定、看起来真实的指纹,换个身份再换一套。
全抹掉也可疑。 有些方案直接让 canvas 读取返回空白或报错。但绝大多数正常浏览器都能正常读取,一个"读不出任何东西"的浏览器在统计上极其罕见,等于举着牌子说自己不正常。
思路二:换一套自洽的环境。 比单点改 Canvas 更稳妥的是,让整台设备的各项特征彼此协调。如果你声称自己是某个系统、某个显卡,那么字体、WebGL、时区等信息都要能对得上。指纹之间互相矛盾,比某一项异常更容易暴露。
思路三:接受"我就是普通的一员"。 防护的目标不是做到独一无二的隐身,而是让自己落进一个足够大的普通人群里,不显眼。
对多账号场景,手工做到上面这些几乎不现实,所以通常会借助专门的防关联/指纹浏览器,为每个身份维护一套独立且自洽、长期稳定的环境。虎鲸 AI 浏览器就是面向这类场景的一个选择:它对 Canvas 采用强度可调的边缘像素噪声,并让每个环境的指纹保持独立、各项自洽——目的是降低多账号被关联的概率,而不是把指纹抹成空白。
小结
Canvas 指纹利用的是"同样的绘图在不同设备上结果不同"这一事实,把设备渲染行为变成一个稳定的追踪标识。它隐蔽、绕过 Cookie,对多账号用户尤其敏感。应对它的要点不是把指纹抹得干干净净,而是让它既稳定又普通、各项特征彼此自洽——这往往比单纯"隐藏"更难,也更有效。