Fingerprintjs2设备指纹采集器笔记

冯风史
2023-12-01

1.下载方式


2.使用方式

总结自Github文档

2.1默认方式

使用setTimeoutrequestIdleCallback 将其延迟几毫秒以确保指纹一致,options 为自定义配置项,result 是计算出来的指纹ID,components 为计算指纹时所使用到的组件数组

if (window.requestIdleCallback) {
requestIdleCallback(function () {
	//必须在v2.0语法提供options参数
	Fingerprint2.getV18(options, function (result, components) {
  	console.log(result);//结果是哈希指纹
  	console.log(components);//组件是{key:'foo'的数组,值:'组件值'}
})
    })
} else {
    setTimeout(function () {
    Fingerprint2.getV18(options, function (result, components) {
  	console.log(result);//结果是哈希指纹
  	console.log(components);//组件是{key:'foo'的数组,值:'组件值'}
})
    }, 500)
}

如果使用get ,它不会对结果进行哈希处理,需手动使用murmur哈希函数(可替换成自定义的哈希函数)来创建哈希指纹

 Fingerprint2.get(options,function (components) {
   var values = components.map(function (component) { return component.value })
   var murmur = Fingerprint2.x64hash128(values.join(''), 31)
 })

2.2配置

2.2.1配置方式:

var options = {fonts: {extendedJsFonts: true}, excludes: {userAgent: true}}

2.2.2默认选项配置(源码):

var defaultOptions = {
    preprocessor: null,
    audio: {
      timeout: 1000,
 // 在iOS 11上,音频上下文只能用于响应用户交互。我们要求用户在iOS 11上显式启用音频指纹https://stackoverflow.com/questions/46363048/onaudioprocess-not-called-on-ios11#46534088
      excludeIOS11: true
    },
    fonts: {
      swfContainerId: 'fingerprintjs2',
      swfPath: 'flash/compiled/FontList.swf',
      userDefinedFonts: [],
      extendedJsFonts: false
    },
    screen: {
       // 当用户旋转移动设备时确保指纹一致
      detectScreenOrientation: true
    },
    plugins: {
      sortPluginsFor: [/palemoon/i],
      excludeIE: false
    },
    extraComponents: [],
    excludes: {
      // Unreliable on Windows, see https://github.com/Valve/fingerprintjs2/issues/375
      'enumerateDevices': true,
      // 取决于浏览器缩放
      'pixelRatio': true,
      //取决于某些浏览器的隐身模式 
      'doNotTrack': true,
      // 已经使用JS字体
      'fontsFlash': true
    },
    NOT_AVAILABLE: 'not available',
    ERROR: 'error',
    EXCLUDED: 'excluded'
  }


2.2.3配置项涵义:

配置项名称备注
fonts.extendedJsFonts: false 或 : true默认false检测65种字体,为true时将可检测字体增加到500,指纹持续时间从大约80-100毫秒增加到最多2000毫秒(冷字体缓存),移动设备慎用
fonts.userDefinedFonts: [] (字体名称数组) : [ “Nimbus Mono “,”Junicode”,”Presto “]指定用户定义字体数组,以进一步增加字体指纹熵
fonts.swfContainerId: fingerprintjs2 (flash字体名称)指定要用于swf嵌入的dom元素ID(flash字体)
fonts.swfPath: 'flash/compiled/FontList.swf' (路径)指定FontList.swf(flash字体)的路径
screen.detectScreenOrientation: true:或 false默认值:true ,当用户旋转移动设备时确保指纹一致
plugins.sortPluginsFor: [/palemoon/i] (决定插件顺序的正则表列表)默认值:[/palemoon/i] ,浏览器随机插件顺序。可以提供应该对插件进行排序的用户代理正则表的列表。
plugins.excludeIE: true 或: false跳过IE插件枚举/检测
audio.excludeIOS11:true或:false默认值:true ,除非从用户交互(屏幕点击)开始,否则iOS 11会阻止音频指纹识别,从而阻止指纹识别过程完成。如果您确定从用户交互事件处理程序开始指纹识别,则可以在iOS 11上启用音频指纹识别。
audio.timeout:1000默认值1000 ,'audio’组件允许的最长时间ms
fontsFlash:true或:false要使用Flash字体枚举,请确保您具有可用的swfobject。如果不这样做,库将完全跳过Flash部分
extraComponents:[] (额外key,getData组成的数组)或 :[{ key: 'customKey',getData: function (done, options) {done('infos')}}] 包含额外组件的数组。自定义增加一些计算指纹的配置项值
preprocessor:null或:function(key,value){...}使用每个组件值时调用的函数,可用于在计算指纹之前修改组件值。例如:从用户代理剥离浏览器版本。
excludes:{} (包含所有):{ 'enumerateDevices': true,'pixelRatio': true,'doNotTrack': true,'fontsFlash': true} (默认配置)具有要排除的组件键的对象。空对象包含所有内容(本文档最后)。默认情况下,大多数组件都包含在内
常量NOT_AVAILABLE: ' not available ',ERROR : ' error ',EXCLUDED : ' excluded 'Fingerprint2.NOT_AVAILABLE = ‘not available’,Fingerprint2.ERROR = ‘error’,Fingerprint2.EXCLUDED = ‘excluded’ 用于不可用,错误或排除组件值的常量。公开和可配置的。

参考:

Excludes为{}时将包含即不会排除以下组件(源码)

 var components = [
    {key: 'userAgent', getData: UserAgent},//用户代理
    {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}
	//可用的多媒体输入和输出设备的信息。
	  ]


 类似资料: