HTML5 Canvas指纹及反追踪介绍

摘要:
HTML5Canvas指纹和反跟踪简介1画布指纹简介许多网站通过画布指纹跟踪用户。BrowserSleaks[1]是一个在线检测画布指纹的网站。一般的指纹实现原理是通过画布绘制一些图形,填写一些单词,然后获得该图形的base64代码,然后经过哈希后获得最终指纹。“是”:“否”)ctx.textBaseline='alphabetic'ctx.fillStyle='#f60'ctx.FillRecctx.fill Style='#069'//https://github.com/Valve/fingerprintjs2/issues/66if{ctx.font='11ptArial'}其他{ctx.font='11ptno-real-font-123'}ctx.fillTextctx.fillStyle='rgb'ctx.font='18ptArial'ctx。fillText//canvasblending//http://blogs.adobe.com/webplatform/2013/01/28/blending-features-in-canvas///http://jsfiddle.net/NDYV8/16/ctx.globalCompositeOperation='multiply'ctx.fillStyle='rgb'ctx.beginPath()ctx.arcctx.closePath()ctx.fill()ctx.fillStyle='rdb'ctx.beginPath。fillStyle='rgb'//canvaswinding//http://blogs.adobe.com/webplatform/2013/01/30/winding-rules-in-canvas///http://jsfiddle.net/NDYV8/19/ctx.arcctx.arcctx.fillif{result.push}returnresult}2通过引入1防止被跟踪。为了防止被跟踪,您需要调整生成以避免暴露自己的数据。此外,canvas提供getImageData[2]以获取图形的像素数据。更改此处的数据也会更改结果。这里我们以anticanvas[3]为例。其他处理方法的原理类似。

HTML5 Canvas指纹及反追踪介绍

1 Canvas指纹的简介
很多网站通过Canvas指纹来跟踪用户。browserleaks[1]是一个在线检测canvas指纹的网站。一般的指纹实现原理即通过canvas画布绘制一些图形,填写一些文字,随后获取图形的base64编码,再经过hash后得到最终的指纹。

下面是一个简单的例子,最终调用toDataUrl会生成一段编码。

var getCanvasFp = function (options) {
var result = []
// Very simple now, need to make it more complex (geo shapes etc)
var canvas = document.createElement('canvas')
canvas.width = 2000
canvas.height = 200
canvas.style.display = 'inline'
var ctx = canvas.getContext('2d')
// detect browser support of canvas winding
// http://blogs.adobe.com/webplatform/2013/01/30/winding-rules-in-canvas/
// https://github.com/Modernizr/Modernizr/blob/master/feature-detects/canvas/winding.js
ctx.rect(0, 0, 10, 10)
ctx.rect(2, 2, 6, 6)
result.push('canvas winding:' + ((ctx.isPointInPath(5, 5, 'evenodd') === false) ? 'yes' : 'no'))

ctx.textBaseline = 'alphabetic'
ctx.fillStyle = '#f60'
ctx.fillRect(125, 1, 62, 20)
ctx.fillStyle = '#069'
// https://github.com/Valve/fingerprintjs2/issues/66
if (options.dontUseFakeFontInCanvas) {
ctx.font = '11pt Arial'
} else {
ctx.font = '11pt no-real-font-123'
}
ctx.fillText('Cwm fjordbank glyphs vext quiz, ud83dude03', 2, 15)
ctx.fillStyle = 'rgba(102, 204, 0, 0.2)'
ctx.font = '18pt Arial'
ctx.fillText('Cwm fjordbank glyphs vext quiz, ud83dude03', 4, 45)

// canvas blending
// http://blogs.adobe.com/webplatform/2013/01/28/blending-features-in-canvas/
// http://jsfiddle.net/NDYV8/16/
ctx.globalCompositeOperation = 'multiply'
ctx.fillStyle = 'rgb(255,0,255)'
ctx.beginPath()
ctx.arc(50, 50, 50, 0, Math.PI * 2, true)
ctx.closePath()
ctx.fill()
ctx.fillStyle = 'rgb(0,255,255)'
ctx.beginPath()
ctx.arc(100, 50, 50, 0, Math.PI * 2, true)
ctx.closePath()
ctx.fill()
ctx.fillStyle = 'rgb(255,255,0)'
ctx.beginPath()
ctx.arc(75, 100, 50, 0, Math.PI * 2, true)
ctx.closePath()
ctx.fill()
ctx.fillStyle = 'rgb(255,0,255)'
// canvas winding
// http://blogs.adobe.com/webplatform/2013/01/30/winding-rules-in-canvas/
// http://jsfiddle.net/NDYV8/19/
ctx.arc(75, 75, 75, 0, Math.PI * 2, true)
ctx.arc(75, 75, 25, 0, Math.PI * 2, true)
ctx.fill('evenodd')

if (canvas.toDataURL) { result.push('canvas fp:' + canvas.toDataURL()) }
return result
}

2 防止被追踪
通过1的介绍,为了防止被追踪,需要对生成进行调整,这样避免暴露自己的数据。变化的形式有很多,例如变换颜色,透明度及字体。此外canvas提供了getImageData[2]得到一个图形的像素数据,对这里的数据进行变化也能对结果进行变化。这里以anticanvas[3]为例,其它的处理方法原理类似。 下面的样例代码原理很简单,就是通过对原始方法进行拦截来对当前结果改变。在编码中通过闭包[4]保存原始方法。最终实现代理的效果,原始方法调用前对参数进行修改。

(function(){
CanvasRenderingContext2D.prototype.getImageData = function(a) {
return function() {
console.log("Context");
spoofFromContext(this,a);
return a.apply(this, arguments);
};
}(CanvasRenderingContext2D.prototype.getImageData);
HTMLCanvasElement.prototype.toDataURL=(function(){
var original = HTMLCanvasElement.prototype.toDataURL;
return function() {
spoof(this);
return original.apply(this,arguments);
};
})();
function spoof(canvas){
var ctx = canvas.getContext("2d");
spoofFromContext(ctx);
}
function spoofFromContext(ctx,a){
if(!a) a = ctx.getImageData;
var data = a.call(ctx,0, 0, ctx.canvas.width, ctx.canvas.height);
for(var c=0; c<data.data.length; c=c+4){
var r = data.data[c];
var g = data.data[c+1];
var b = data.data[c+2];
var a = data.data[c+3];
if(a!=0){
data.data[c]=r-Math.random();
data.data[c+1]=g-Math.random();
data.data[c+2]=b-Math.random();
data.data[c+3]=a-Math.random();
}
}
ctx.putImageData(data, 0, 0);
console.log("Spoofed");
}
})();

3参考
[1].canvas指纹,https://browserleaks.com/canvas#how-does-it-work
[2].getImageData使用简介,https://blog.csdn.net/FE_dev/article/details/82586698
[3].anticanvas,https://github.com/WolfspiritM/AntiCF/blob/master/anticanvas.js
[4].JS闭包http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
————————————————
版权声明:本文为CSDN博主「FserSuN」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Revivedsun/article/details/103534149

免责声明:文章转载自《HTML5 Canvas指纹及反追踪介绍》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[因为离职, 所以转一篇文章]Michael专栏NO.82:留住背影Python 函数参数使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

小白自制Linux开发板 七. USB驱动配置

本文章基于https://whycan.com/t_3087.htmlhttps://whycan.com/t_6021.html整理 F1c100s芯片支持USB的OTG模式,也就是可以通过更改UsbId拉低或拉高方式定义当前的开发板可以作为host还是device。 usbid 拉高时,开发板作为外设方式。 usbid 拉低时,开发板作为主机方式。...

服务器使用Gzip压缩数据,加快网络传输(Java 例子)

The next version of the Project will provide support for gzip in order to faster speed of data transmission on the network。在我们的项目中,添加对gzip的支持,是为了加快数据在网络中的传输速度。If you need to trans...

小程序canvas生成二维码图片踩的坑

1:生成临时图片,保证画布被加载以及渲染(即本身不可以 hidden 或是 上级元素不可以 hidden 或是 wx:if 隐藏等)  == 》 建议:因为 canvas 的组件层级(z-index)是最高的,无法通过层级改变,如自定义的弹框类似的组件总会被挡住   == 》 若不想给挡住,便要控制 canvas 隐藏(hidden 、 wx:if)  ...

微信小程序---数组操作

原数组A Page({ data: { listA:[{id:1,name:'芒果',count:1},{id:2,name:'香蕉',count:6},    ]} }) 向前插入新数据(数组B) //要增加的数组B(newArrayB) var newArrayB = [{id:6,name:'向前增加数据--'...

python+requests接口自动化--请求方法封装

1 import requests 2 from common.logger import Log 3 from common import cof 4 from common import base 5 6 7 class MyHttpservice(object): 8 9 def __init__(self): 10...

小程序:前端防止用户重复提交&amp;amp;即时消息(IM)重复发送问题解决

背景: 最近参与开发的小程序,涉及到即时消息(IM)发送的功能; 聊天界面如下,通过键盘上的【发送】按钮,触发消息发送功能 问题发现: 功能开发完毕,进入测试流程;测试工程师反馈说: 在Android手机上,在极短的时间内频繁点击键盘上的【发送】按钮,消息会重复发送;IOS上该问题不太明显 本以为是普通的防重复提交问题,于是自然想到通过设定flag/js...