在前端开发中,如何获取浏览器的唯一标识

由于不同的系统显卡绘制 canvas 时渲染参数、抗锯齿等算法不同,因此绘制成图片数据的 CRC 校验也不一样。

function getCanvasFp () {
  const canvas = document.getElementById('canvas')
  const ctx = canvas.getContext('2d')
  ctx.font = '14px Arial'
  ctx.fillStyle = '#ccc'
  ctx.fillText('hello, shanyue', 2, 2)
  return canvas.toDataURL('image/jpeg')
}

因此根据 canvas 可以获取浏览器指纹信息。

  1. 绘制 canvas,获取 base64 的 dataurl
  2. 对 dataurl 这个字符串进行 md5 摘要计算,得到指纹信息

但是对于常见的需求就有成熟的解决方案,若在生产环境使用,可以使用以下库

它依据以下信息,获取到浏览器指纹信息,而这些信息,则成为 component

  1. canvas
  2. webgl
  3. UserAgent
  4. AudioContext
  5. 对新式 API 的支持程度等
requestIdleCallback(function () {
  Fingerprint2.get((components) => {
    const values = components.map((component) => component.value)
    const fp = Fingerprint2.x64hash128(values.join(''), 31)
  })
})

在 fingerprintjs2 中,对于 component 也有分类

  • browser independent component:有些 component 同一设备跨浏览器也可以得到相同的值,有些独立浏览器,得到不同的值
  • stable component: 有些 component 刷新后值就会发生变化,称为不稳定组件

在实际业务中,可根据业务选择合适的组件

const options = {
  excludes: {userAgent: true, language: true}
}

简答

根据 canvas 可以获取浏览器指纹信息

  1. 绘制 canvas,获取 base64 的 dataurl
  2. 对 dataurl 这个字符串进行 md5 摘要计算,得到指纹信息

若在生产环境使用,可以使用 fingerprintjs2,根据业务需求,如单设备是否可跨浏览器,以此选择合适的 component

posted @   Magi黄元  阅读(13406)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示