Canvas指纹识别是一种浏览器追踪技术,利用HTML5 Canvas API绘制一张不可见的图像, 再读取像素数据来为你的设备创建唯一标识符——无需Cookie,无需存储,没有任何可删除的内容。 你现在就可以在 whatsmy.fyi 上测试你的浏览器是否暴露了Canvas指纹。
简介
Canvas指纹识别是一种追踪方法,它让你的浏览器绘制一张隐藏图像,然后读取像素数据来识别你的设备。 之所以有效,是因为你的GPU、操作系统和字体渲染器各自会在图像绘制方式上引入细微但一致的差异—— 人眼看不出来,但对于硬件和软件的组合来说却是独一无二的。
什么是Canvas指纹识别?
Canvas指纹识别利用了HTML5 Canvas API——一个允许浏览器直接在浏览器窗口中绘制图形的功能。 每款现代浏览器都支持它,这意味着追踪面几乎是通用的。 当一个指纹脚本运行时,它会创建一个对你完全不可见的离屏canvas元素,在上面绘制文字和形状, 然后调用canvas.toDataURL()将像素数据读取为Base64字符串。 该字符串随后被哈希为一个紧凑、稳定的指纹。
Canvas指纹识别之所以强大,在于像素输出在不同设备上并不完全一致。 相同的绘图命令会因你的GPU制造商、显卡驱动版本、操作系统、已安装字体和抗锯齿设置的不同而产生细微差异。 两台看起来相同的机器——相同的操作系统、相同的浏览器版本——由于GPU驱动不同,仍可能产生不同的Canvas哈希值。 电子前哨基金会(EFF)的Cover Your Tracks 工具一贯将Canvas输出列为浏览器指纹识别工具包中熵值最高的信号之一。
Canvas指纹识别是更广泛的 浏览器指纹识别 技术家族中的一个组成部分。与Cookie不同,它不需要在你的设备上存储任何内容, 清除浏览历史、启用私人模式或切换网络对其完全没有影响。
Canvas指纹识别是如何工作的?
整个过程分四步进行,每步只需几毫秒,对用户完全不可见。
第一步——绘制Canvas
一段JavaScript代码创建一个离屏canvas元素,使用特定字体、颜色和混合模式绘制文字、形状和渐变的组合。 绘图的复杂性很重要:简单的几何形状产生的变化较少;带有阴影和渐变的字体密集文字产生的变化更多。
第二步——GPU和操作系统渲染
浏览器将绘图指令传递给操作系统的图形栈。 在Windows上,ClearType负责子像素字体渲染。 在macOS上,Core Text应用其自己的字体提示算法。 在Linux上,FreeType的渲染方式又有所不同。 你的GPU负责处理抗锯齿和颜色插值。每一层都在像素级别引入一致但与设备相关的变化。
第三步——像素提取
脚本调用canvas.toDataURL()将完成的图像读取为Base64编码的PNG。 该字符串编码了每个像素值——包括渲染过程中引入的子像素变化。 或者,脚本也可以使用canvas.getImageData()直接访问原始像素缓冲区。
第四步——哈希处理
Base64字符串或原始像素缓冲区被哈希处理——通常使用MurmurHash或MD5——生成一个紧凑、稳定的指纹值。 该哈希值被传输到追踪服务器并存储为设备标识符。
// 最简化的Canvas指纹识别示例
function getCanvasFingerprint() {
const canvas = document.createElement('canvas');
canvas.width = 280;
canvas.height = 60;
const ctx = canvas.getContext('2d');
// 背景 — 颜色混合因GPU而异
ctx.fillStyle = 'rgb(255, 102, 0)';
ctx.fillRect(10, 10, 100, 30);
// 文字 — 字体渲染因操作系统而异(ClearType / Core Text / FreeType)
ctx.fillStyle = '#069';
ctx.font = '18px Arial';
ctx.fillText('Canvas fingerprint', 2, 45);
// 阴影 — 阴影渲染因显卡驱动而异
ctx.shadowColor = 'rgba(0, 0, 0, 0.5)';
ctx.shadowBlur = 6;
ctx.shadowOffsetX = 2;
ctx.shadowOffsetY = 3;
// 返回一个在不同设备上略有差异的Base64字符串
// 即使浏览器和操作系统版本完全相同
return canvas.toDataURL();
}Canvas指纹有多独特?
Canvas指纹识别为整体浏览器指纹贡献了大量熵值。研究结果因数据集和方法论而异,但方向是一致的: Canvas输出是一个高信号标识符,尤其是与其他浏览器属性结合时。
| 研究发现 | 数值 | 来源 |
|---|---|---|
| Canvas单独的熵值 | 8–10比特 | EFF Cover Your Tracks |
| 仅通过Canvas可唯一识别的浏览器比例 | 83.6% | BrowserLeaks |
| 前20,000个网站中使用Canvas指纹识别的比例 | 12.7% | ACM互联网测量会议,2025年 |
| 真实世界整体唯一性(800万个指纹) | 33.6% | 学术实地研究,2018年 |
| 移动设备上的Canvas唯一性 | 62% | ACM互联网测量会议,2025年 |
实验室结果(80–90%的唯一性)与真实世界数据(33.6%)之间存在差距, 原因是许多流行配置会产生相同的Canvas输出。 例如,所有运行相同macOS和Safari版本的MacBook Pro共享同一个Canvas哈希。 唯一性在GPU和驱动程序组合不寻常的设备上最高。移动设备得分更高,因为硬件碎片化程度更大。
谁在真实世界中使用Canvas指纹识别?
广告网络
广告技术公司使用Canvas指纹识别跨网站追踪用户,用于行为定向和频次控制。 随着第三方Cookie在各主流浏览器中被弃用,Canvas指纹识别变得尤为有价值—— 它在大多数当前实现中无需任何Cookie或用户同意即可发挥与Cookie相同的识别作用。
欺诈检测平台
安全公司如 Fingerprint(原FingerprintJS) 和Castle.io使用Canvas指纹识别来检测账户接管、凭证填充和机器人活动。 如果设备的Canvas指纹与账户记录中的指纹不匹配,就会触发风险信号。 这种用途通常在GDPR的合法利益基础下获得认可,无需明确同意。
付费墙和计量访问执行
新闻出版商和订阅服务使用Canvas指纹识别来对清除Cookie以重置计量访问计数器的用户执行文章限制。 因为指纹来源于硬件而非存储数据,它在Cookie删除和私人浏览后仍然持续存在。
Canvas指纹识别合法吗?
在欧洲的GDPR框架下,当Canvas指纹识别生成的哈希值可以合理地与个人关联时, 构成对个人数据的处理。法国数据保护机构(CNIL)已明确将浏览器指纹识别列为需要知情同意的行为, 除非适用有限的合法利益豁免。 在美国的CCPA和CPRA下,指纹识别数据被视为需要选择退出权的个人信息, 多起集体诉讼已针对在未披露情况下使用指纹识别的广告技术公司提起。
如何保护自己免受Canvas指纹识别
完全防护是困难的——有效的防御涉及网络兼容性的权衡。以下选项按从最强到日常使用最实用的顺序排列:
- Tor浏览器(最强保护):Tor将Canvas输出标准化, 使每个Tor用户返回相同的Canvas哈希,使个人识别成为不可能。 代价是由于Tor网络而导致浏览速度变慢。
- Brave浏览器(推荐日常使用):Brave使用一种叫做 Farbling 的技术——它向Canvas像素输出注入细微的、随机化的、每次会话的噪声值。 你的指纹在每次会话中都会改变,跨网站追踪变得不可靠,而你在视觉上无法区分差异。
- 启用
privacy.resistFingerprinting的Firefox:在about:config中将此标志设置为true,使Firefox返回统一的Canvas输出, 类似于Tor浏览器。默认禁用;某些依赖基于Canvas图形的网站可能表现异常。 - CanvasBlocker扩展(Firefox和Chrome):此扩展拦截
canvas.toDataURL()和getImageData()调用, 完全屏蔽它们或返回随机数据。对于需要指纹保护但不想切换浏览器的用户很有用。 - 避免使用稀有字体或不寻常的GPU驱动:保持驱动程序更新并使用标准硬件可以降低Canvas输出的唯一性。 稀有驱动程序版本会产生更具识别性的渲染特征。
- 使用VPN——但了解其局限性:VPN可以隐藏你的IP地址, 但对Canvas输出没有任何影响。它消除了一层追踪,但无法解决指纹识别问题。 在 whatsmy.fyi 上检查你的VPN是否正常工作。
常见问题
Canvas指纹识别在隐身/私人模式下有效吗?
是的。私人浏览模式可以防止你的浏览器将历史记录、Cookie和表单数据保存到磁盘上—— 但它不会改变你的GPU、显卡驱动或操作系统字体渲染器。 你的Canvas指纹在隐身模式和普通窗口中完全相同。 只有具有主动指纹随机化功能的浏览器(如Brave或Tor浏览器)才会表现不同。
VPN能防止Canvas指纹识别吗?
不能。VPN改变你的可见IP地址,并通过加密隧道路由流量, 但它不涉及浏览器的渲染栈。Canvas指纹识别读取GPU和操作系统级别的渲染数据, 这完全不受你的流量通过哪个服务器的影响。 要防护Canvas指纹识别,请使用Brave浏览器、启用privacy.resistFingerprinting的Firefox,或Tor浏览器。
Canvas指纹识别与Cookie追踪相同吗?
不同。Cookie追踪在你的设备上存储一个标识符文件,你可以查看、删除或屏蔽它。 Canvas指纹识别什么都不存储——它在每次访问时都从你设备的硬件和软件特征中重建标识符。 清除Cookie、删除本地存储或屏蔽第三方Cookie对Canvas指纹识别没有任何影响。
禁用JavaScript能阻止Canvas指纹识别吗?
是的——Canvas指纹识别需要JavaScript才能运行。 如果你完全禁用JavaScript,指纹识别脚本就无法执行。 然而,禁用JavaScript会破坏大多数现代网站。 更实际的方法是使用Brave的Farbling或CanvasBlocker扩展, 它们专门拦截Canvas API调用,而不会禁用通用的JavaScript功能。
Canvas指纹识别与WebGL指纹识别有何不同?
两者都利用了浏览器的图形渲染管线,但它们针对不同的API。 Canvas指纹识别使用2D Canvas API,对字体渲染和子像素文字差异敏感。 WebGL指纹识别使用3D图形API,直接暴露你的GPU供应商名称、GPU型号和驱动程序版本。 它们通常一起部署,因为它们捕获设备唯一性的不同维度。 查看 WebGL指纹识别指南 了解更多详情。
Canvas指纹识别本身足以完全替代Cookie吗?
仅靠Canvas指纹识别是不够的——在大型数据集中的真实唯一性约为33.6%。 但当与WebGL渲染器数据、音频指纹、屏幕尺寸、时区和硬件并发数结合时, 组合指纹接近Cookie级别的准确性。商业指纹识别平台通常会将30个或更多信号叠加, Canvas作为贡献最高的单个组件之一。
相关文章
- 什么是浏览器指纹?网站如何在没有Cookie的情况下追踪你 — 所有指纹信号组合的完整指南
- 什么是WebGL指纹识别?你的GPU如何识别你的浏览器 — 3D图形API如何暴露你的GPU供应商和驱动程序版本
- 什么是音频指纹识别?AudioContext如何追踪你的浏览器 — 你的设备音频栈如何产生唯一标识符
- 什么是字体指纹识别?已安装字体如何在网上追踪你 — 你安装的字体如何构成你的浏览器指纹



