【前言】
一般情况下 , 网站或者广告联盟都会非常想要一种技术方式可以在网络上精确定位到每一个个体 , 这样可以通过收集这些个体的数据 , 通过分析后更加精准的去推送广告(精准化营销)或其他有针对性的一些活动 。Cookie技术是非常受欢迎的一种 。当用户访问一个网站时 , 网站可以在用户当前的浏览器Cookie中永久植入一个含有唯一标示符(UUID)的信息 , 并通过这个信息将用户所有行为(浏览了哪些页面?搜索了哪些关键字?对什么感兴趣?点了哪些按钮?用了哪些功能?看了哪些商品?把哪些放入了购物车等等)关联起来 。
而随着网民对个人隐私的重视 , Cookie越来越不受待见 。不少安全工具甚至是浏览器都开始允许或引导用户关闭Cookie功能 , 比如很多主流浏览器都有一个“隐私模式浏览”功能 。这样以来 , 网站就很难追踪用户行为了 。但仍然有一些方法可以让网站去追踪每一个访问者的行为 , 比如通过flash cookie的方式也可以达到唯一标识和追踪的目的 。
笔者近期注意到 , 国外媒体报道了一种非常难以摆脱的新型在线追踪工具被用来尾随从白宫官网到色情网站YouPorn.com的热门网站的访问者 。经过分析 , 这个就是另一种比较新的访客追踪技术:“帆布指纹识别”技术 , 具体代码见附录6 。这个技术的独特之处是:它不像通过Cookie或者Flash Cookie等之类的方式 , 你基本是无法屏蔽它的 。
【原理分析】
笔者收集整理了很多知名站点上的类似代码 , 详见附录4 , 从这些“帆布指纹识别”代码可以看出 , 均使用到了html5专属标签<canvas>的一个现状:在绘制canvas图片时 , 同样的canvas绘制代码 , 不同机器和浏览器绘制的图片特征是相同并且独一无二的 , 这样以来 , 提取最简单的md5值便可以唯一标识和跟踪这个用户 。
一段产生canvas元素的JAVAscript代码:
Default
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);
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校验码便可以用于用户的唯一标识:
Default
var b64 = canvas.toDataURL().replace(“data:image/png;base64,”,””);
var bin = atob(b64);
var crc = bin2hex(bin.slice(-16,-12));
console.log(crc);
var b64 = canvas.toDataURL().replace(“data:image/png;base64,”,””);
var bin = atob(b64);
var crc = bin2hex(bin.slice(-16,-12));
console.log(crc);
chrome隐身模式测试:
文章插图
同一机器的chrome浏览器 , 无论正常模式还是隐身模式 , 得到的crc值始终一致 。而对于不同机器得到的值是不同的 , 追踪效果显而易见 。
看到这里 , 相信很多人想问 , Why?为什么会出现这样的情况?同样的js代码 , 在不同设备的浏览器上 , 结果是唯一并且各不相同的 。这到底是为什么?其实原因很简单 , 同样的HTML5 Canvas元素绘制操作 , 在不同的操作系统不同的浏览器上 , 产生的图片内容其实是不完全相同的 。出现这种情况可能是有几个原因:
推荐阅读
- 大佬Google工作10年,关于技术、管理和职场生涯的一些感悟
- 2022年顶级网络安全专家最爱的5大数据加密方法
- 如何开启关闭MacBook的系统语音提示功能?
- 你会消除图片里的马赛克?我来告诉你
- 分享自学编程中经常遇到的问题和一些自学方法
- 为什么学习PHP?
- 修复Ubuntu中Realtek RTL8156B 2.5GbE USB适配器的性能问题
- 在头条创作 五天突破瓶颈的方法
- 竟然把通信协议讲的如此通俗?
- 红茶能配蜂蜜柚子吗,蜂蜜枸杞柚子茶的功效与作用