TEST12138

TEST12138

长路漫漫,唯心作伴。

浏览器指纹

大家有时可能会浏览一些网站,浏览的时候会打开无痕窗口
打开以后就认为无痕了,那么实际上是这样吗
实际情况可能要细思极恐的多
它不仅知道你是谁,还知道你干了什么,而且它知道的比你想的多的多
有人就会说了,不就是通过 ip 吗,我挂个代理不就行了
如果我告诉你不用 IP 也能知道呢
那么是怎么做到的呢
这得益于一个叫浏览器指纹的技术,这是一个非常非常成熟的技术
可以在没有 cookie、没有登录的情况下,准确的知道用户是谁
实现原理也非常简单
全世界有这么多的设备,但是很难找出两个一样的设备环境
比如 ip 地址、浏览器版本、浏览器的语言、浏览器的字体设置、时区等等
基于这些信息,生成一个或者多个哈希值,那么这个或者多个哈希值大概率是唯一的
不能保证完全不重复,但是唯一性比较高
比如用 canvas 生成一个 hash
简单写一下

		function getCanvasFingerprint() {
			const canvas = document.createElement('canvas')
			canvas.width = 200;
			canvas.height = 200
			const ctx = canvas.getContext('2d');
			ctx.fillStyle = 'rgb(128,0,0)';
			ctx.fillRect(10, 10, 100, 100);
			ctx.fillStyle = 'rgb(0,128,0)';
			ctx.fillRect(50, 50, 100, 100);
			ctx.fillStyle = 'rgb(0,128,0)';
			ctx.fillRect(30, 30, 80, 80);
			ctx.font = '20px Arial';
			ctx.fillStyle = 'rgb(0,0,0)';
			ctx.fillText('hello', 60, 110);
			const dataURL = canvas.toDataURL();
			const hash = hashCode(dataURL)
			return hash
		}

		function hashCode(str) {
			let hash = 0;
			for (let i = 0; i < str.length; i++) {
				const char = str.charCodeAt(i);
				hash = (hash << 5) - hash + char;
				hash |= 0;
			}
			return hash
		}
		const canvasFing = getCanvasFingerprint()
		console.log(canvasFing)

正常浏览生成的值是 291669864

image

无痕浏览下是也是 291669864

image

怎么才能不一样呢
换个浏览器或者设备

image

Screenshot_20230802_151336

绘制同样的一个 canvas 为什么生成的值不一样呢
这是因为不同的浏览器,同一个浏览器的不同版本,不同的操作系统,不同的硬件,他们的绘制引擎或多或少都有差异,尽管绘制的是同一个 canvas,但是绘制出来的都会有一些肉眼难以察觉的差异,生成到数据里,就会造成数据的差异
这是受很多因素影响的,甚至可能你在浏览器上安装了个插件都会造成影响,包括浏览器设置,操作环境设置等
这只是一个 canvas,如果综合其它生成的 hash 值,仅仅一个代理是没用的
这个主要用途是广告(购物广告等),防刷(刷票,刷播放量等)
但是根本是为了分辨用户,所以如果你浏览的某些网站要分辨你的话,还是很容易的

不过有一个东西叫指纹浏览器,可以在一个浏览器里面切换不同的指纹,但是都是收费的
实现方式也非常简单,针对不同的指纹方式,去更改相应的 API

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。