Canvas 指纹
约 3 分钟阅读
最后更新: 2026-02-28
什么是 Canvas 指纹
Canvas 指纹是一种浏览器指纹技术,利用 HTML5 Canvas API 让浏览器绘制特定的图形和文本,然后根据结果的微小差异来识别用户。
即使执行相同的绘图命令,由于 GPU 类型、图形驱动版本、操作系统字体渲染引擎和抗锯齿实现的差异,会在像素级别产生不同的结果。将这些差异转换为哈希值,作为识别设备的「指纹」使用。
技术原理
Canvas 指纹的生成按以下步骤进行:
- 使用 JavaScript 创建隐藏的 Canvas 元素
- 绘制特定的文本(使用多种字体、大小和颜色)、图形(渐变、曲线、阴影等)和图像处理(混合模式)
- 使用
canvas.toDataURL()获取像素数据 - 计算获取数据的哈希值作为指纹
这个过程在用户不知情的情况下几毫秒内完成。由于不像 Cookie 那样在浏览器中存储数据,用户难以删除或阻止。
研究表明,Canvas 指纹单独的唯一性约为 50%,但与 WebGL 信息、AudioContext 指纹和字体列表等结合后,识别精度可超过 90%。
实际应用场景
- 广告追踪:与追踪像素和 Cookie 结合,用于重新识别已删除 Cookie 的用户。
- 欺诈检测:银行和在线服务用它来判断登录时的设备是否与平时不同。这是其合法用途之一。
- 机器人检测:自动化工具和无头浏览器的 Canvas 渲染结果与真实浏览器不同,可用于识别机器人。
虽然存在隐私隐患,但其在欺诈检测和安全方面的应用也有保护用户的一面。
防护措施
- Tor 浏览器:调用 Canvas API 时向用户请求确认,未经许可则返回空白数据。所有用户拥有完全相同的指纹。
- Firefox 的 resistFingerprinting:在
about:config中启用privacy.resistFingerprinting,会在 Canvas 渲染结果中添加噪声,降低唯一性。 - Canvas Blocker 扩展:阻止 Canvas API 调用或注入随机噪声,使指纹每次访问都不同。
- 浏览器隔离:在远程浏览器隔离环境中,Canvas 渲染在云端虚拟浏览器中进行,用户的实际终端信息不会泄露。
不过,阻止 Canvas 本身也会成为指纹的一个要素(阻止的用户是少数派,因此更容易被识别),这是一个矛盾的问题。像 Tor 浏览器那样「所有人都一样」的方式最为有效。
实践对策与各浏览器设置
Canvas 指纹的防护措施因浏览器不同,配置方法和效果差异很大。请了解各浏览器的具体设置步骤。
Firefox:打开 about:config,将 privacy.resistFingerprinting 设为 true。启用此设置后,Canvas 渲染结果会被标准化,时区报告统一为 UTC 等多项保护同时生效,降低指纹的唯一性。但部分网站可能出现显示异常的副作用,需要为受影响的网站单独设置例外。
Brave:默认启用 Canvas 指纹防护。Brave 在每次 Canvas API 调用时注入随机噪声,即使访问同一网站也会生成不同的指纹。可在 brave://settings/shields 的「指纹阻止」中调整强度。
Tor 浏览器:提供最强的防护。采用「统一渲染」方式,使所有用户的 Canvas 渲染结果完全相同。调用 Canvas API 时显示确认对话框,用户未明确许可则返回空白数据。由于所有用户共享相同的指纹,个体识别变得不可能。
CanvasBlocker 扩展:Firefox 的附加组件,可以精细控制 Canvas API 的行为。提供多种模式:「返回伪造值」、「阻止 API」或「请求许可」。支持按站点设置白名单,可以在合法使用 Canvas 的网站(地图服务、在线游戏等)上允许,其他网站则阻止,实现灵活运用。
常见误解
- 仅靠 Canvas 指纹就能完全识别个人
- Canvas 指纹单独的唯一性约为 50%。使用相同 GPU 和驱动的设备会返回相同结果。与其他指纹技术结合后识别精度才会提高。
- 删除 Cookie 就能防止 Canvas 指纹
- Canvas 指纹不在浏览器中存储任何内容。它根据设备的硬件和软件特征生成,因此删除 Cookie 或使用隐身模式都无法防止。