Canvas 指纹
Canvas fingerprinting 是一种通过电脑绘图方式来识别它的方法。网站要求浏览器绘制一张带有文字和图形的隐形图片,取得结果,并从中计算出一个校验和。
图片是同一张,但不同机器算出的校验和却不同:绘图工作由显卡完成,而显卡本身、驱动程序、字体集合以及抗锯齿处理中的细微差异,会在输出端产生不同的像素。人眼看不出差别——但数字能看出来。
同样的手法也适用于 WebGL(三维图形,外加以纯文本形式给出的显卡名称)和 AudioContext(用音频处理代替图片)。
为什么这是一个强有力的线索
Canvas 校验和不存储在任何文件里——无法像 Cookie 那样被清除。它每次访问都会重新计算,并且在你更换电脑、显卡或驱动程序之前始终保持不变。
这就是为什么从同一台机器打开的两个账号,在 canvas 上看起来像同一个人,哪怕其他一切都不同。
粗糙的伪装为什么危险
伪装通常靠噪声来实现:在结果中加入几乎察觉不到的偏差,使校验和发生变化。这里很容易把事情弄得比原来更糟,有三种典型方式:
- 噪声在每次读取时都会变化。 真实的机器对同一个请求会给出同一个答案。如果校验和在两次调用之间跳变,那就不是"独特的电脑",而是明显的伪装——用连续两次请求就能验证出来。
- 噪声过大。 数值偏移到了真实设备从不会出现的区间。
- Canvas 被伪装了,但 WebGL 里的显卡信息仍然是真实的。 两个本应相互关联的数值开始互相矛盾。
规则与整个指纹体系一样:一致性比独特性更重要。 一个稳定、普通的指纹,好过一个独一无二的指纹。
如何检查
指纹检测会显示你的 canvas 校验和,并连续读取两次——这样就能看出这个值是保持不变还是发生跳变。
