前端使用fingerprintjs2获取浏览器指纹

洪祺
2023-12-01

什么是浏览器指纹

浏览器指纹我们可以理解成是一个用户设备的浏览器的唯一id(有点类似手机设备的IMEI),通过浏览器指纹,我们可以做一些埋点操作或者是鉴权,辨别是否是同一用户,其是否有更换设备(更换浏览器)等

什么是fingerprintjs2

fingerprintjs2是通过设备浏览器信息获取浏览器指纹的插件(官方宣称其识别精度达到99.5%),详细了解可查看fingerprintjs2官方文档

如何使用fingerprintjs2

以VUE中使用为例

  • 安装
npm i fingerprintjs2 -S
  • 您不应在页面加载时或加载后直接运行指纹。 而是使用setTimeout或requestIdleCallback将其延迟几毫秒,以确保指纹一致。

  • 组件中(此例默认以浏览器所有的配置信息生成浏览器指纹)

<template>
  <div id="app">
  </div>
</template>

<script>
import Fingerprint2 from 'fingerprintjs2'; // 引入fingerprintjs2

export default {
  name: 'App',
  components: {
  },
  data() {
    return {
    };
  },
  async created() {
  	// 您不应在页面加载时或加载后直接运行指纹。 而是使用setTimeout或requestIdleCallback将其延迟几毫秒,以确保指纹一致。
    if (window.requestIdleCallback) {
      requestIdleCallback(() => {
        this.createFingerprint();
      });
    } else {
      setTimeout(() => {
        this.createFingerprint();
      }, 500);
    }
  },
  methods: {
  	// 创建浏览器指纹
	createFingerprint() {
	  // 浏览器指纹
      const fingerprint = Fingerprint2.get((components) => { // 参数只有回调函数时,默认浏览器指纹依据所有配置信息进行生成
        const values = components.map(component => component.value); // 配置的值的数组
        const murmur = Fingerprint2.x64hash128(values.join(''), 31); // 生成浏览器指纹
        console.log(components);
        console.log(values);
        console.log(murmur);
        localStorage.setItem('browserId', murmur); // 存储浏览器指纹,在项目中用于校验用户身份和埋点
      });
	},
  },
};
</script>

<style lang="less">
</style>

自定义选择浏览器的部分配置信息生成浏览器指纹

  • 浏览器可选配置信息如下
var components = [
    {key: 'userAgent', getData: UserAgent},//用户代理
    {key: 'webdriver', getData: webdriver },//网页内驱动软件
    {key: 'language', getData: languageKey},//语言种类
    {key: 'colorDepth', getData: colorDepthKey},	//目标设备或缓冲器上的调色板的比特深度
    {key: 'deviceMemory', getData: deviceMemoryKey},//设备内存
    {key: 'pixelRatio', getData: pixelRatioKey},//设备像素比
    {key: 'hardwareConcurrency', getData: hardwareConcurrencyKey},//可用于运行在用户的计算机上的线程的逻辑处理器的数量。
    {key: 'screenResolution', getData: screenResolutionKey},	//当前屏幕分辨率
    {key: 'availableScreenResolution', getData: availableScreenResolutionKey},//屏幕宽高(空白空间)
    {key: 'timezoneOffset', getData: timezoneOffset},//本地时间与 GMT 时间之间的时间差,以分钟为单位
    {key: 'timezone', getData: timezone},//时区
    {key: 'sessionStorage', getData: sessionStorageKey},//是否会话存储
    {key: 'localStorage', getData: localStorageKey},//是否具有本地存储   
    {key: 'indexedDb', getData: indexedDbKey},//是否具有索引DB
    {key: 'addBehavior', getData: addBehaviorKey},//IE是否指定AddBehavior
    {key: 'openDatabase', getData: openDatabaseKey},//是否有打开的DB
    {key: 'cpuClass', getData: cpuClassKey},//浏览器系统的CPU等级
    {key: 'platform', getData: platformKey},//运行浏览器的操作系统和(或)硬件平台
    {key: 'doNotTrack', getData: doNotTrackKey},//do-not-track设置
    {key: 'plugins', getData: pluginsComponent},//浏览器的插件信息
    {key: 'canvas', getData: canvasKey},//使用 Canvas 绘图
    {key: 'webgl', getData: webglKey},//WebGL指纹信息
    {key: 'webglVendorAndRenderer', getData: webglVendorAndRendererKey},//具有大量熵的WebGL指纹的子集
    {key: 'adBlock', getData: adBlockKey},//是否安装AdBlock
    {key: 'hasLiedLanguages', getData: hasLiedLanguagesKey},//用户是否篡改了语言
    {key: 'hasLiedResolution', getData: hasLiedResolutionKey},//用户是否篡改了屏幕分辨率
    {key: 'hasLiedOs', getData: hasLiedOsKey},	//用户是否篡改了操作系统
    {key: 'hasLiedBrowser', getData: hasLiedBrowserKey},	//用户是否篡改了浏览器
    {key: 'touchSupport', getData: touchSupportKey},//触摸屏检测和能力
    {key: 'fonts', getData: jsFontsKey, pauseBefore: true},	//使用JS/CSS检测到的字体列表
    {key: 'fontsFlash', getData: flashFontsKey, pauseBefore: true},	//已安装的Flash字体列表
    {key: 'audio', getData: audioKey},//音频处理
    {key: 'enumerateDevices', getData: enumerateDevicesKey}	//可用的多媒体输入和输出设备的信息。
]
  • 组件中选择浏览器部分配置信息作为参数获取浏览器指纹
<template>
  <div id="app">
  </div>
</template>

<script>
import Fingerprint2 from 'fingerprintjs2'; // 引入fingerprintjs2

export default {
  name: 'App',
  components: {
  },
  data() {
    return {
    };
  },
  async created() {
  	// 您不应在页面加载时或加载后直接运行指纹。 而是使用setTimeout或requestIdleCallback将其延迟几毫秒,以确保指纹一致。
    if (window.requestIdleCallback) {
      requestIdleCallback(() => {
        this.createFingerprint();
      });
    } else {
      setTimeout(() => {
        this.createFingerprint();
      }, 500);
    }
  },
  methods: {
  	// 创建浏览器指纹
  	createFingerprint() {
	  // 选择哪些信息作为浏览器指纹生成的依据
  	  const options = {
  		fonts: {
  		  extendedJsFonts: true,
  	    },
        excludes: {
          audio: true,
          userAgent: true,
          enumerateDevices: true,
          touchSupport: true,
        },
      };
      // 浏览器指纹
      const fingerprint = Fingerprint2.get(options, (components) => { // 参数只有回调函数或者options为{}时,默认浏览器指纹依据所有配置信息进行生成
        const values = components.map(component => component.value); // 配置的值的数组
        const murmur = Fingerprint2.x64hash128(values.join(''), 31); // 生成浏览器指纹
        console.log(components);
        console.log(values);
        console.log(murmur);
        localStorage.setItem('browserId', murmur); // 存储浏览器指纹,在项目中用于校验用户身份和埋点
      });
	},
  },
};
</script>

<style lang="less">
</style>

备注: 本文主要参考以下文章

 类似资料: