fingerprint2生成的用户指纹重复踩坑

17,398 阅读3分钟

fingerprint2 一款开源设备指纹采集器,在github上有7k的Star,看起来是那么的让人放心,今天聊一聊我们在使用这个库中猜到的坑。

本篇所讲的fingerprint2版本为2.0.6

生成的指纹大面积重复问题!!!

生成的指纹大面积重复问题!!!

生成的指纹大面积重复问题!!!

重要的问题讲三次。

fingerprint2会取的设备信息

*获取不到值时返回: not available #获取不到值时返回: error

  1. userAgent:navigator.userAgent
  2. language : 语言
  3. colorDepth: 返回目标设备或缓冲器上的调色板的比特深度 screen.colorDepth *
  4. deviceMemory: 以千兆字节为单位返回设备内存量。该值是通过舍入到最接近的2的幂并将该数除以1024而给出的近似值。链接 *
  5. pixelRatio: 像素比 devicePixelRatio *
  6. hardwareConcurrency:navigator.hardwareConcurrency返回可用于运行在用户的计算机上的线程的逻辑处理器的数量 *
  7. screenResolution: 检测屏幕宽高,并根据屏幕方向矫正返回值[width,height]
  8. availableScreenResolution:返回屏幕分辨率[width,height],无头浏览器无法获取。*
  9. timezoneOffset: 返回从当前区域设置(主机系统设置)到UTC的时区差异(以分钟为单位)链接
  10. timezone:时区 *
  11. sessionStorage: 是否支持sessionStorage,不支持时返回错误 #
  12. localStorage: 是否支持localStorage #
  13. indexedDb:是否支持indexedDb #
  14. addBehavior:此时可能未定义body或以编程方式删除
  15. openDatabase: 返回是否支持Web SQL
  16. cpuClass:返回浏览器系统的 CPU 等级,一般无法获取 *
  17. platform: 返回表示浏览器平台的字符串,该规范允许浏览器始终返回空字符串,因此不要依赖此属性来获得可靠的答案.链接 *
  18. doNotTrack: 返回用户的“不跟踪”设置。如果用户请求不被网站,内容或广告跟踪,则为“1”。一般结果为* 。
  19. plugins:返回浏览器安装的插件列表。*
  20. canvas: 如果浏览器支持canvas则返回生成baes64数据。*
  21. webgl:返回浏览器对webgl绘图协议的支持情况汇总 *
  22. webglVendorAndRenderer: 返会显卡型号相关信息 *
  23. adBlock:返回是否安装去广告插件。
  24. hasLiedLanguages: 返回用户是否改变了首选语言
  25. hasLiedResolution:返回用户是否改变了分辨率
  26. hasLiedOs:返回用户是否改变了操作系统
  27. hasLiedBrowser:返回用户是否改变了浏览器
  28. touchSupport: 返回最大触摸点数,是否支持touch,是否支持ontouchstart事件]
  29. fonts:返回从64种字体种筛选出的可用字体
  30. fontsFlash:Flash字体枚举,如果没有swfobject,不会触发。
  31. audio: 返回音频指纹
  32. enumerateDevices:navigator.mediaDevices 请求可用媒体输入和输出设备的列表,例如麦克风,相机,耳机等

工作逻辑

  1. 取到以上值后[数组],将数组转为值字符串
  2. 将取到的字符串做为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下生成的指纹信息也是有很大概率相同的。

结言

现在浏览器提供的设备信息越来越少,跟踪用户信息这只是一个思路,如果大家有奇技淫巧,欢迎交流。