通过使用evercookie技术实现设备指纹

    设备指纹是互联网中经常使用的一种技术,通过设备指纹技术,为每个设备确定一个唯一的设备ID。由于IP地址个数的限制,内网中往往使用NAT技术,将内网中的上万个IP映射成几个外网IP对外访问。这样内网用户在访问某个网站的使用,一个外网IP很可能对应多个内网IP。可以通过使用设备ID,精确定位到每个终端,以设备ID为基础创建设备画像,能够解决很多IP画像无法解决的问题。理想情况下,一个设备只对应一个设备ID,类似于一个人对应一个身份证号码。

    设备指纹要解决以下几个问题:

    1. 一一对应性。一个设备只能有一个设备ID,同时一个设备ID也只能对应一个设备

    2.可恢复性。设备ID存储在客户端,客户端可能删除了,这时候需要能够恢复

    3.一致性。一个客户端可能采用了多个浏览器,需要将多个浏览器识别成一个设备

    4.稳定性。随着时间的变化,即使客户端的指纹发生了改变,这个设备的设备ID不能发生改变。


指纹系统的架构如下图所示(实线箭头表示数据的流向,虚线箭头表示加工流程):


下面讲述上图的实现原理和过程。

但是如何保证一个设备对应一个设备ID呢?

    每个设备都有他自己的一些特征,也就是它的指纹信息,可以包含如下几项数据:

1.设备的ip地址

2.设备的浏览器以及浏览器上安装的插件信息

3.pc的屏幕大小

4.设备的帆布指纹信息(Canvas)

5.终端登录的用户名

6.flash中的设备信息描述(Capabilities对象),比如说设备的屏幕大小,像素信息

7.设备的操作系统信息

    对于一个网站来说,可能有上亿的设备访问,屏幕信息、帆布指纹、flash设备信息、浏览器插件存在较大的重复性,但是一个IP地址和用户名对应的设备就比较少了。综合考虑设备指纹的各个因素,基本上能做到设备ID和设备指纹一一对应。

    在客户端执行js脚本,可以采集设备的指纹信息和设备ID,通过Ajax发送到服务器。在服务器端接受到js采集的信息后会根据请求是否携带设备ID以及设备ID是否合法进行3种不同处理:

1.请求没有携带设备ID,这种情况下会直接产生一个设备ID,以指纹信息为Key,设备ID为value存储到redis;另外还会把设备ID存储到HBase一份。为了保证产生的设备ID不重复,可以使用UUID方式产生。最后把新产生的设备ID通过Ajax发送给客户端,客户端js将设备ID设置到客户端的各个存储位置。

2.请求携带了设备ID,但是在Redis和HBase都没有查找到设备ID,这个设备ID为非法设备ID。这时产生一个设备ID,以指纹信息为Key,设备ID为value存储到redis。另外还会把设备ID存储到HBase一份。最后把新产生的设备ID通过Ajax发送给客户端,客户端js将设备ID设置到客户端的各个存储位置。

3.请求携带了设备ID,在Redis或者HBase都查找到设备ID,这个时候设备ID合法。以指纹信息为Key,设备ID为value更新redis中存储的设备信息。最后把新产生的设备ID通过Ajax发送给客户端,客户端js将设备ID设置到客户端的各个存储位置。

    通过上图可以发现,一个设备ID在redis里面存储了多份,每份数据的Key是不同的。这时因为通过设备指纹的部分信息,就可以确定出设备ID来,比如说一个用户访问某个网站,使用的终端个数在10个以内,每个终端的ip地址不一样,操作系统也可能不一样,所以可以通过ip+user+os锁定一个设备。但是在使用js采集设备信息的时候,在某些情况下可能采集不全,比如说没有登录的时候,可能不存在user,所以需要根据指纹的不同维度为key进行组合,存储多份数据到redis,避免频繁的到HBase查询设备ID是否存在。     存储到Redis的每份数据都有一定的超时时间,超过超时时间的数据会被redis删除,这样就把活跃设备全部存储到了Redis,尽量减少HBase的访问,有效的提高了吞吐量。

 在客户端,以下几个地方可以存储设备ID:

1.indexdb

2.webSQL

3.cookie

4.localstorage

5.window.name

6.flash

7.sessionstorage

    flash的数据可以在多个浏览器之间共享,因此通过flash技术可以将多个浏览器识别成一个设备。

    服务器端对指纹和eid数据处理完成之后,发送Ajax响应,将设备ID重新记录到客户端的多个位置。这样即使是客户端浏览器,清除了缓存数据,服务器端依然能够找到这个设备的设备ID,并且把设备ID设置到客户端的多个位置。

    通过以上方式,可以有效的实现一套指纹系统。


  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值