帆布指纹识别


一般情况下,网站或者广告联盟都会非常想要一种技术方式可以在网络上精确定位到每一个个体,这样可以通过收集这些个体的数据,通过分析后更加精准的去推送广告(精准化营销)或其他有针对性的一些活动。Cookie技术是非常受欢迎的一种。当用户访问一个网站时,网站可以在用户当前的浏览器Cookie中永久植入一个含有唯一标示符(UUID)的信息,并通过这个信息将用户所有行为(浏览了哪些页面?搜索了哪些关键字?对什么感兴趣?点了哪些按钮?用了哪些功能?看了哪些商品?把哪些放入了购物车等等)关联起来。

而随着网民对个人隐私的重视,Cookie越来越不受待见。不少安全工具甚至是浏览器都开始允许或引导用户关闭Cookie功能,比如很多主流浏览器都有一个“隐私模式浏览”功能。这样以来,网站就很难追踪用户行为了。但仍然有一些方法可以让网站去追踪每一个访问者的行为,比如通过flash cookie的方式也可以达到唯一标识和追踪的目的。

笔者近期注意到,国外媒体报道了一种非常难以摆脱的新型在线追踪工具被用来尾随从白宫官网到色情网站YouPorn.com的热门网站的访问者。经过分析,这个就是另一种比较新的访客追踪技术:“帆布指纹识别”技术,具体代码见附录6。这个技术的独特之处是:它不像通过Cookie或者Flash Cookie等之类的方式,你基本是无法屏蔽它的。

【原理分析】

笔者收集整理了很多知名站点上的类似代码,详见附录4,从这些“帆布指纹识别”代码可以看出,均使用到了HTML5专属标签的一个现状:在绘制canvas图片时,同样的canvas绘制代码,不同机器和浏览器绘制的图片特征是相同并且独一无二的,这样以来,提取最简单的md5值便可以唯一标识和跟踪这个用户。

一段产生canvas元素的javascript代码:

 
 
  1. var canvas = document.createElement('canvas');  
  2. var ctx = canvas.getContext('2d');  
  3. var txt = 'http://security.tencent.com/';  
  4. ctx.textBaseline = "top";  
  5. ctx.font = "14px 'Arial'";  
  6. ctx.textBaseline = "tencent";  
  7. ctx.fillStyle = "#f60";  
  8. ctx.fillRect(125,1,62,20);  
  9. ctx.fillStyle = "#069";  
  10. ctx.fillText(txt, 2, 15);  
  11. ctx.fillStyle = "rgba(102, 204, 0, 0.7)";  
  12. ctx.fillText(txt, 4, 17); 

获取绘画的内容,需要使用到canvas.toDataURL()方法,该方法返回的是图片内容的base64编码字符串。对于PNG文件格式,以块(chunk)划分,最后一块是一段32位的CRC校验,提取这段CRC校验码便可以用于用户的唯一标识:

 
 
  1. var b64 = canvas.toDataURL().replace("data:image/png;base64,","");  
  2. var bin = atob(b64);  
  3. var crc = bin2hex(bin.slice(-16,-12));  
  4. console.log(crc); 

chrome隐身模式测试:

取代cookie的网站追踪技术:”帆布指纹识别”初探

同一机器的chrome浏览器,无论正常模式还是隐身模式,得到的crc值始终一致。而对于不同机器得到的值是不同的,追踪效果显而易见。

看到这里,相信很多人想问,Why?为什么会出现这样的情况?同样的js代码,在不同设备的浏览器上,结果是唯一并且各不相同的。这到底是为什么?其实原因很简单,同样的HTML5 Canvas元素绘制操作,在不同的操作系统不同的浏览器上,产生的图片内容其实是不完全相同的。出现这种情况可能是有几个原因:

1、在图片格式上,不同web浏览器使用了不同的图形处理引擎、不同的图片导出选项、不同的默认压缩级别等。

2、在像素级别来看,操作系统各自使用了不同的设置和算法来进行抗锯齿和子像素渲染操作。

因此,即使是相同的绘图操作,最终产生的图片数据在hash层面上依然是不同的。这个具体代码层面,恐怕要去搞懂各个主流浏览器的实现和以及操作系统的渲染。笔者精力所限,短期很难给出。

【后话】

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


帆布指纹识别(canvas fingerprinting)

广告联盟或许网站运营者都希望能够精准定位并标识每一个个体,通过对用户行为的分析(浏览了哪些页面?搜索了哪些关键字?对什么感兴趣?点了哪些按钮?用了哪些功能?看了哪些商品?把哪些放入了购物车等等),为用户推送更加精准的广告(精准化营销)。同时,通过对用户的标识,可以将不同站点的用户进行关联。

在过去,实现上述cookie是最受欢迎的一种。但由于移动互联网的发展,移动设备限制、用户禁用cookie。使得cookie愈来愈不受待见。伴随着html5的成熟,通过canvas fingerprinting技术标识一个唯一的浏览器逐渐被接受。它的特点是不通过cookie,用户基本无法屏蔽它 。

其实现原理:

复制代码
 1 var canvas = document.createElement('canvas');
 2 var ctx = canvas.getContext('2d');
 3 var txt = 'http://security.tencent.com/';
 4 ctx.textBaseline = "top";
 5 ctx.font = "14px 'Arial'";
 6 ctx.textBaseline = "tencent";
 7 ctx.fillStyle = "#f60";
 8 ctx.fillRect(125,1,62,20);
 9 ctx.fillStyle = "#069";
10 ctx.fillText(txt, 2, 15);
11 ctx.fillStyle = "rgba(102, 204, 0, 0.7)";
12 ctx.fillText(txt, 4, 17);
复制代码

获取绘画的内容,需要使用到canvas.toDataURL()方法,该方法返回的是图片内容的base64编码字符串。对于PNG文件格式,以块(chunk)划分,最后一块是一段32位的CRC校验,提取这段CRC校验码便可以用于用户的唯一标识

1 var b64 = canvas.toDataURL().replace("data:image/png;base64,","");
2 var bin = atob(b64);
3 var crc = bin2hex(bin.slice(-16,-12));
4 console.log(crc);

通过验证,crc在一定程度上标识了浏览器的唯一性,但是,在相同设备,相同浏览器上,重复特别严重。国外有一个经过优化后的表示浏览器的唯一性的js,https://github.com/Valve/fingerprintJS

它除了利用canvas以外,还加入了其它的影响因素,这些因素包括

  1. 浏览器http请求中的用户代理-navigator.userAgent
  2. 浏览器的语言(中文、英文……)-navigator.language
  3. 设备屏幕的色彩信息-screen.colorDepth
  4. 设备屏幕的宽高-screen.height screen.width
  5. 格林威治时间和本地时间之间的时差-Date().getTimezoneOffset()
  6. 是否支持sessionStorage-window.sessionStorage
  7. 是否支持localStorage-window.localStorage
  8. 是否支持indexdDB-window.indexedDB
  9. 是否支持-docment.body.addBehavior(IE5的一个属性)
  10. 是否支持调用本地数据库-window.openDatabase
  11. 浏览器所在系统的CPU等级-navigator.cupClass
  12. 客户端的操作系统-navigator.platform
  13. 是否支持Do not track功能-navigator.doNotTrack
  14. 获取浏览器部分插件信息-flash plugin、Adobe PDF reader、QuickTime、real players、ShockWave player、Windows media player、Silverlight、Skype
  15. canvas指纹

 

官网数据显示,该标识精准度达94%,基于原理 https://panopticlick.eff.org/browser-uniqueness.pdf

国内一程序员在此基础上做了 测试,测试结果https://docs.zoho.com/sheet/ropen.do?rid=08m2ga1cf6790c0eb4d8c8f7e54ca6ddb9b72

 

表格 1
手机型号系统Android原生 or Safariuc浏览器qq浏览器微信浏览器备注
  算法优化过的fingerprint简单的示例代码算法优化过的fingerprint简单的示例代码版本算法优化过的fingerprint简单的示例代码版本算法优化过的fingerprint简单的示例代码版本 
SonyEricsson LT15iAndroid 2.3.43069863566390fde4f13175605099ce51412v9.9.0.45921771814763ea97fcav5.2    
Sony X10iAndroid 2.3.33113311216js出错26376310519ce51412v9.9.0.45921312347273ea97fcav5.22678610518js出错v5.3.1原生的刷新优化过生成的id不会变化
摩托罗拉 MB526Android 2.3.62364220961js出错无sd卡无法安装浏览器应用程序
华为 u9508Android 4.0.439055531917e41cc0f4273392099b699d48cv9.9.0.459158705092978de4112v5.2.0.87040269156357e41cc0fv5.3.1 
OPPO X907Android 4.0.37266845027e41cc0f2089481481d07a1ee9v9.9.0.459323194345078de4112v5.28882697677e41cc0fv5.3.1 
htc t528wAndroid 4.1.1319655688a6cb1bf9247900438556d50248v9.8356698439244ae093v5.2.1.8802025279959a6cb1bf9v5.3.1 
2307781626d07a1ee9v9.9.0.459
红米移动版Android 4.2.123916897339c6ad73c   1950263795244ae093v5.2.1.8801813996467244ae093v5.4beta 
HUAWEI A199Android 4.1.27866134269c6ad73c156829089100000000v8.7.23315869337c1e8ddabv4.235145487819c6ad73cv5.3.1UCv8.7.2不支持canvas,每次刷新优化后生成的id会变化,示例代码生成id一直是8个0
1118832592b699d48cv9.9.0.4591980938942244ae093v5.2
HUAWEI P6-T00Android 4.2.228909258159c6ad73c452391340b699d48cv9.9.0.4593877925850244ae093v5.238367739099c6ad73cv5.3.1 
魅族 M353Android 4.2.119141104089c6ad73c3750243844431d50f8v9.9.0.4593750421827244ae093v5.210961331879c6ad73cv5.3.0 
4822954089c6ad73cv5.3.1 
HTC 802wAndroid 4.2.226577612439c6ad73c2182659327dedbb2dev9.8.0.4352352114048244ae093v5.213285364639c6ad73cv4.5 
22064822892bc8041av9.9.0.4591720649299c6ad73cv5.3.1 
红米 noetAndroid 4.2.23981610359c6ad73c197430937d07a1ee9v9.8.9.4578601441049c6ad73cv5.026950873499c6ad73cv5.3.1 
三星 GT-N7100Android 4.2.232294179359c6ad73c7558396639fb1a593v9.8.9.4571643973998b31ee991v5.220366620419c6ad73cv5.1 
8542780079c6ad73cv5.3.1 
Lenovo K900Android 4.2.117580749079c6ad73c      34651191149c6ad73cv5.3.1 
三星 galaxy s5Android 4.4.249806560829725ab4749934522d2a60b1dv9.8.9.4572294751620cd456c4av5.2.1.88018879347958140f6e0v5.2 
38071872498140f6e0v5.3.1
三星 GT-I9505Android 4.31180998254f8f416c18988583014228c48ev9.9.0.4592205938319a3ee5a29v5.24256482719fbf76091v5.3.1 
三星 note3Android 4.339234668764f8f416c19619629330482a2ac灵动版4087844410482a2acv5.0.2.71042217769860482a2acv5.3.1 
40238070844546f3bbv9.8.0.435 
vivo x3tAndroid 4.2.12341248451da5b08ce1512563799c36972cav9.9.0.459367705500733834835v5.1.0.7803748495542da5b08cev5.2.1原生浏览器版本v2.3.1
2341248451da5b08ce208062917133834835v5.2.1.880293292691da5b08cev5.3.1原生浏览器版本v2.3.3
vivo X1Android 4.1.1752680764da5b08ce4192034694c36972cav9.9.0.459402969698533834835v5.21912866602da5b08cev5.3.1 
三星 GT-I9502Android 4.2.23824555000d457e86b427110114353288053v9.7.943995818985231dbc3ddv5.0.0.6503721105672759549f9v4.5.1 
86111921809ca4266v9.9.0.459442109150759549f9v5.3.1 
LG nexus5Android 4.3193484871491aedadb2787277112a0d15a90v9.9.0.459246265161291aedadbv5.2.1.880369013343191aedadbv5.3.1 
三星 GT-S7562Android 4.0.426149192940d5b2b4b4360799660b27d3d8v9.7.5.41835268090b437c248v5.216591087450d5b2b4bv5.3.1 
502410648d155acfav9.8.9.457 
Huawei P1 U9200Android 4.0.331774167122d694a48405171118356d50248v9.6.0.3784124042100fa189661v4.516015817017e41cc0fv5.3.1 
3743446141d07a1ee9v9.8.9.457 
Nokia XAndroid 4.1.235982025887ba05ba8765903625859aa2b8v9.9.0.4593070076558418420bfv5.22591054263bee57099v5.0.3 
1779200183bee57099v5.3.1 
iphone 3GSiOS 6.027541821679fcce73624269937939fcce736v9.7.1.45040191793229fcce736v4.330343201879fcce736v5.3.1 
touch 4iOS 6.0.113267096319fcce736   26146333049fcce736v4.531072941919fcce736v5.3.1 
iphone5siOS 7.1.235951043890304845291353517803048452v9.8.0.451   272212802403048452v5.3.1 
ipad 2iOS 7.0.41287507670304845237924070603048452v2.4.2.414327162223803048452v4.2.1    
iphone 4SiOS 7.0.628623808999fd0577f25580518489fd0577fv9.7.5.43836205242729fd0577fv5.2.128593151089fd0577fv5.3.1 
touch 5GiOS 7.1.127023259069fd0577f37728027229fd0577fv9.8.0.45129702881959fd0577fv5.2.14954678439fd0577fv5.3.1 
iphone 5ciOS 8.013008494699fd0577f25616220319fd0577fv9.8.0.45132889666999fd0577fv5.2.137679779649fd0577fv5.3.1 
 备注说明有特殊背景色的单元格说明有重复,同背景色同字体颜色的,是相同的数据

其测试结论 

1.由于涉及设备以及浏览器的判定因素非常多,重复性很低,31台设备皆无重复

但是可以设想,毕竟是通过各种属性值去判断唯一性,理想情况下如果两台设备相同浏览器各种设置也相同,还是会出现重复

2.也正因为涉及的因素多,一旦设备系统更新 or 浏览器版本更新 or 浏览器关键插件有变化(版本更新 or 新增卸载关键插件) ,生成的ID都会改变,由于浏览器版本更新还是比较频繁的,很容易失去之前跟踪的用户

结论:canvas指纹只能作为一参考属性去判断设备的唯一性,不能只用这一个因素来判定设备唯一性。fingerPrint.js也不能取代cookie,但是可以作为辅助,如果用户清除了cookie的情况下,还可以通过fingerPrint.js跟踪到该用户重新set cookie(结论参考)

 

在一些场景下:

 一般一个指纹跟踪不是永久的跟踪的概念,而是在一个战役内进行活动的跟踪,比如可以发布3个活动,3个活动分别是扫二维码打开一个网址,在另外一个网页内操作,在第三个网页内进行别的操作,然后被采集后在后台通过指纹进行关联,得到本次战役的目标

中间可以通过搞一个抽奖,要用户输入手机号码验证后抽奖,来做一些连接。

 

知识是我们已知的也是我们未知的基于已有的知识之上我们去发现未知的由此,知识得到扩充我们获得的知识越多未知的知识就会更多因而,知识扩充永无止境
标签: 指纹识别



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
养虾的池塘材料一般有水泥、塑料、土壤等,其中比较常见的是帆布池。以下是帆布池养虾的教程及注意事项: 1. 池塘选址:选择一块平地,避免池塘建在低洼处或水流较快的地方。 2. 池塘准备:根据需要的池塘大小,选择合适尺寸的帆布池,清理池塘周围的杂草、石头、树枝等,确保池塘周围干净整洁。 3. 帆布池铺设:将帆布池铺放在平整的地面上,注意帆布池四周的边缘要铺平,以免发生漏水现象。 4. 池塘充水:在池塘内加入适量的水,水深不宜过浅或过深,一般建议水深在1.5米左右。 5. 添加养殖饵料:根据虾的品种和养殖的目的,选择适合的饵料,比如鱼粉、豆粉、米糠等。在虾苗投放前,需在水中添加充足的饵料,以促进虾苗的生长。 6. 投放虾苗:在虾池内投放虾苗,投放数量根据池塘的大小而定。虾苗投放前需进行适当的处理,比如消毒、浸泡等,以消除害虫和疾病的影响。 7. 日常养护:定期清理池塘一周围的杂草和底泥,避免过度积累。同时,要注意池塘水质的保持,定期检测水质,确保养殖环境健康。 注意事项: 1. 帆布池养虾的水源要保持清洁,避免水中杂质和有害物质的污染。 2. 养殖过程中,要注意虾苗的生长情况,及时调整养殖饵料的种类和用量。 3. 避免池塘过度养殖,以免引起疾病和污染。 4. 在池塘投放虾苗前,一定要进行虾苗的检疫和消毒,预防疾病的发生。 5. 养殖过程中,要注意池塘的通风和保湿,避免池塘水温过高或过低,影响虾的生长。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值