fingerprint2 一款开源设备指纹采集器,在github上有7k的Star,看起来是那么的让人放心,今天聊一聊我们在使用这个库中猜到的坑。
本篇所讲的fingerprint2版本为2.0.6
生成的指纹大面积重复问题!!!
生成的指纹大面积重复问题!!!
生成的指纹大面积重复问题!!!
重要的问题讲三次。
*获取不到值时返回: not available #获取不到值时返回: error
userAgent
:navigator.userAgentlanguage
: 语言colorDepth
: 返回目标设备或缓冲器上的调色板的比特深度 screen.colorDepth *deviceMemory
: 以千兆字节为单位返回设备内存量。该值是通过舍入到最接近的2的幂并将该数除以1024而给出的近似值。链接 *pixelRatio
: 像素比 devicePixelRatio *hardwareConcurrency
:navigator.hardwareConcurrency返回可用于运行在用户的计算机上的线程的逻辑处理器的数量 *screenResolution
: 检测屏幕宽高,并根据屏幕方向矫正返回值[width,height]
availableScreenResolution
:返回屏幕分辨率[width,height]
,无头浏览器无法获取。*timezoneOffset
: 返回从当前区域设置(主机系统设置)到UTC的时区差异(以分钟为单位)链接timezone
:时区 *sessionStorage
: 是否支持sessionStorage,不支持时返回错误 #localStorage
: 是否支持localStorage #indexedDb
:是否支持indexedDb #addBehavior
:此时可能未定义body或以编程方式删除openDatabase
: 返回是否支持Web SQLcpuClass
:返回浏览器系统的 CPU 等级,一般无法获取 *platform
: 返回表示浏览器平台的字符串,该规范允许浏览器始终返回空字符串,因此不要依赖此属性来获得可靠的答案.链接 *doNotTrack
: 返回用户的“不跟踪”设置。如果用户请求不被网站,内容或广告跟踪,则为“1”。一般结果为* 。plugins
:返回浏览器安装的插件列表。*canvas
: 如果浏览器支持canvas则返回生成baes64数据。*webgl
:返回浏览器对webgl绘图协议的支持情况汇总 *webglVendorAndRenderer
: 返会显卡型号相关信息 *adBlock
:返回是否安装去广告插件。hasLiedLanguages
: 返回用户是否改变了首选语言hasLiedResolution
:返回用户是否改变了分辨率hasLiedOs
:返回用户是否改变了操作系统hasLiedBrowser
:返回用户是否改变了浏览器touchSupport
: 返回最大触摸点数,是否支持touch,是否支持ontouchstart事件]fonts
:返回从64种字体种筛选出的可用字体fontsFlash
:Flash字体枚举,如果没有swfobject,不会触发。audio
: 返回音频指纹enumerateDevices
:navigator.mediaDevices 请求可用媒体输入和输出设备的列表,例如麦克风,相机,耳机等
- 取到以上值后[数组],将数组转为值字符串
- 将取到的字符串做为key 传入
x64hash128
方法,生成指纹
x64hash128
算法是固定的,所以在key相同的时,生成的指纹是相同的。
fingerprint2在手机上重复的概率会更高,绝大多数用户不会去修改手机的配置,所以重复指纹主要在发生在同一型号的产品。
因为我们主要面对移动终端用户,所以fingerprint2生成的值出现大面积重复(实践中的血与泪)。
- 通过接口获取用户ip值
- FingerPrint2继续使用默认配置,在传入的
key
中手动添加Ip
条件;Fingerprint2.get(components=>{ components.push({ key:'ip', value:'192.168.1.1' //通过接口获取的到ip }); let murmur = Fingerprint2.x64hash128(components.join(""), 31); //生成指纹信息 })
加入ip信息,可以在很大程度上规避同型号的产品生成指纹信息相同的场景,切记不是百分之百。比如同一型号设备在同一wifi下生成的指纹信息也是有很大概率相同的。
现在浏览器提供的设备信息越来越少,跟踪用户信息这只是一个思路,如果大家有奇技淫巧,欢迎交流。