取代cookie的网站追踪技术:”帆布指纹识别”
来源:互联网 发布:js requestanimframe 编辑:程序博客网 时间:2024/06/10 21:07
原文:http://blog.jobbole.com/74461/
【前言】
一般情况下,网站或者广告联盟都会非常想要一种技术方式可以在网络上精确定位到每一个个体,这样可以通过收集这些个体的数据,通过分析后更加精准的去推送广告(精准化营销)或其他有针对性的一些活动。Cookie技术是非常受欢迎的一种。当用户访问一个网站时,网站可以在用户当前的浏览器Cookie中永久植入一个含有唯一标示符(UUID)的信息,并通过这个信息将用户所有行为(浏览了哪些页面?搜索了哪些关键字?对什么感兴趣?点了哪些按钮?用了哪些功能?看了哪些商品?把哪些放入了购物车等等)关联起来。
而随着网民对个人隐私的重视,Cookie越来越不受待见。不少安全工具甚至是浏览器都开始允许或引导用户关闭Cookie功能,比如很多主流浏览器都有一个“隐私模式浏览”功能。这样以来,网站就很难追踪用户行为了。但仍然有一些方法可以让网站去追踪每一个访问者的行为,比如通过flash cookie的方式也可以达到唯一标识和追踪的目的。
笔者近期注意到,国外媒体报道了一种非常难以摆脱的新型在线追踪工具被用来尾随从白宫官网到色情网站YouPorn.com的热门网站的访问者。经过分析,这个就是另一种比较新的访客追踪技术:“帆布指纹识别”技术,具体代码见附录6。这个技术的独特之处是:它不像通过Cookie或者Flash Cookie等之类的方式,你基本是无法屏蔽它的。
【原理分析】
笔者收集整理了很多知名站点上的类似代码,详见附录4,从这些“帆布指纹识别”代码可以看出,均使用到了HTML5专属标签<canvas>的一个现状:在绘制canvas图片时,同样的canvas绘制代码,不同机器绘制的图片特征是各不相同并且独一无二的,这样一来,提取最简单的md5值便可以唯一标识和跟踪这个用户。
一段产生canvas元素的javascript代码:
var canvas = document.createElement('canvas');var ctx = canvas.getContext('2d');var txt = 'http://security.tencent.com/';ctx.textBaseline = "top";ctx.font = "14px 'Arial'";ctx.textBaseline = "tencent";ctx.fillStyle = "#f60";ctx.fillRect(125,1,62,20);ctx.fillStyle = "#069";ctx.fillText(txt, 2, 15);ctx.fillStyle = "rgba(102, 204, 0, 0.7)";ctx.fillText(txt, 4, 17);
获取绘画的内容,需要使用到canvas.toDataURL()方法,该方法返回的是图片内容的base64编码字符串。对于PNG文件格式,以块(chunk)划分,最后一块是一段32位的CRC校验,提取这段CRC校验码便可以用于用户的唯一标识:
var b64 = canvas.toDataURL().replace("data:image/png;base64,","");var bin = atob(b64);var crc = bin2hex(bin.slice(-16,-12));console.log(crc);//bin2hex函数如下:function bin2hex(str) {var result = "";for (i = 0; i < str.length; i++ ) {var c = str.charCodeAt(i);result += byte2Hex(c>>8 & 0xff); // 高字节result += byte2Hex(c & 0xff);// 低字节}return result;}function byte2Hex(b) {if(b < 0x10)return "0" + b.toString(16);elsereturn b.toString(16);}
chrome隐身模式测试:
同一机器的chrome浏览器,无论正常模式还是隐身模式,得到的crc值始终一致。而对于不同机器或者不同浏览器得到的值是不同的,追踪效果显而易见。
看到这里,相信很多人想问,Why?为什么会出现这样的情况?同样的js代码,在不同设备的浏览器上,结果是唯一并且各不相同的。这到底是为什么?其实原因很简单,同样的HTML5 Canvas元素绘制操作,在不同的操作系统不同的浏览器上,产生的图片内容其实是不完全相同的。出现这种情况可能是有几个原因:
1、在图片格式上,不同web浏览器使用了不同的图形处理引擎、不同的图片导出选项、不同的默认压缩级别等。
2、在像素级别来看,操作系统各自使用了不同的设置和算法来进行抗锯齿和子像素渲染操作。
因此,即使是相同的绘图操作,最终产生的图片数据在hash层面上依然是不同的。这个具体代码层面,恐怕要去搞懂各个主流浏览器的实现和以及操作系统的渲染。笔者精力所限,短期很难给出。大家可以自行摸索下,欢迎交流J
【后话】
HTML5千变万化,利用canvas 这一特性来实现用户追踪,目前并没有好的对抗方案,未来也只能依靠广大浏览器厂商自行了断,实现canvas绘图机制的随机化或许可以很好的保护用户隐私,防止被追踪。
文中涉及到的代码和技术细节,只限用于技术交流,切勿用于非法用途。另外,如果想要研究更多的用户追踪技术,推荐去研究下大名鼎鼎的专注于访客追踪的开源项目:evercookie【附录5】,这个猥琐的小工具,通过几乎所有你想到和想不到的方式(Cookie、Flash、Silverlight、Web History、HTTP ETags、Web cache、window.name caching、userData storage、HTML5、甚至是java的漏洞等)来跟踪访问网站的用户行为。
【附录】
[1] http://cseweb.ucsd.edu/~hovav/dist/canvas.pdf
[2] https://securehomes.esat.kuleuven.be/~gacar/sticky/index.html
[3] https://panopticlick.eff.org/browser-uniqueness.pdf
[4] 部分“帆布指纹鉴别代码”地址列表:
http://ct1.addthis.com/static/r07/core130.js
http://i.ligatus.com/script/fingerprint.min.js
http://src.kitcode.net/fp2.js
http://admicro1.vcmedia.vn/fingerprint/figp.js
http://shorte.st/js/packed/smeadvert-intermediate-ad.js
http://stat.ringier.cz/js/fingerprint.min.js
http://cya2.net/js/STAT/89946.js
http://images.revtrax.com/RevTrax/js/fp/fp.min.jsp
http://rackcdn.com/mongoose.fp.js
[5] evercookie官网 http://samy.pl/evercookie/
[6] 使用帆布指纹识别技术的库fingerprintjs 官网 https://github.com/Valve/fingerprintjs
[7] https://www.browserleaks.com/canvas#how-does-it-work
--------------------------------------------------------------------以上为转载内容-------------------------------------------------------------
我试了一下,不同浏览器是产生的不一样,但是同一型号的电脑,同样的浏览器产生的是一样的,这就有问题了,同一台电脑可以产生一样的,但不同的电脑只是型号一样,不应该产生一样的结果才是!
- 取代cookie的网站追踪技术:“帆布指纹识别”初探
- 取代cookie的网站追踪技术:”帆布指纹识别”
- “帆布指纹识别”初探——伟大而牛逼的网站追踪技术
- 帆布指纹识别
- 不用Cookie的“Cookie”技术 可用于追踪用户
- 帆布指纹识别——用户无隐私
- 关于指纹识别技术的报道
- 手机指纹识别技术:移动商务的“安全带”
- 指纹识别技术的基本原理及过程
- 指纹识别技术的基本原理及过程
- 基于SSL中间证书的指纹识别技术
- 用户追踪之基础技术——Cookie
- 手机指纹识别技术
- Http指纹识别技术
- Http指纹识别技术
- 浅谈web指纹识别技术
- HTTP指纹识别技术
- 超声波指纹识别技术
- C#读取Excel五种方式的体会
- 《剑指offer》之跳台阶
- makefile深度学习(一个工程实例来学习 Makefile)
- Mybatis拦截器定义
- kafka集群搭建步骤
- 取代cookie的网站追踪技术:”帆布指纹识别”
- Jenkins(十四)获取代码提交的日志
- Android Studio NDK开发-环境配置
- 如何让孩子爱上设计模式 ——21.访问者模式(Visitor Pattern)
- 欢迎进入半颗心脏博客导航一站式搜索(所有博客的汇总帖)
- java面试题及答案(1)
- SQL GROUP BY 语句
- MFC下的容器选择
- IntelliJ IDEA 设置代码不自动折叠