当前位置: 首页 > article >正文

跨浏览器设备指纹

主流的设备指纹生成方式有利用canvas或者webGL,音频指纹可以用于补充


function getCanvasFingerprint() {
  const canvas = document.getElementById('fingerprintCanvas');
  const ctx = canvas.getContext('2d');

  // 进行一些绘制
  ctx.textBaseline = "top";
  ctx.font = "16px 'Arial'";
  ctx.fillText("Hello, World!", 2, 2);

  // 绘制一些图形
  ctx.fillStyle = "rgba(255, 0, 0, 0.5)";
  ctx.fillRect(0, 0, 100, 100);
  ctx.fillStyle = "rgba(0, 255, 0, 0.5)";
  ctx.fillRect(100, 100, 100, 100);

  // 获取图像数据
  const dataURL = canvas.toDataURL();
  return hex_md5(dataURL);
}

function getWebGLFingerprint() {
const canvas = document.getElementById('canvas');
const gl = canvas.getContext('webgl');
const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
const renderer = debugInfo ? gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) : '';
const vendor = debugInfo ? gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) : '';

// 获取其他特征
const version = gl.getParameter(gl.VERSION);
const shadingLanguageVersion = gl.getParameter(gl.SHADING_LANGUAGE_VERSION);
const extensions = gl.getSupportedExtensions();

const str = `${vendor}||${renderer}||${version}||${shadingLanguageVersion}`;
return hex_md5(str);
console.log(extensions)
}

async function generateAudioFingerprint() {
  // 创建音频上下文
  const audioContext = new (window.AudioContext || window.webkitAudioContext)();
  
  // 创建一个音频振荡器
  const oscillator = audioContext.createOscillator();
  oscillator.type = 'sine'; // 可以是 'sine', 'square', 'sawtooth' 或 'triangle'
  oscillator.frequency.value = 440; // A4音符,频率440Hz

  // 创建一个分析器
  const analyser = audioContext.createAnalyser();
  analyser.fftSize = 2048; // 频谱分析的精度

  // 将振荡器连接到分析器,然后连接到音频上下文的目的地
  oscillator.connect(analyser);
  analyser.connect(audioContext.destination);

  // 开始产生声音
  oscillator.start();

  // 在一定时间后停止振荡器
  setTimeout(() => {
      oscillator.stop();
      audioContext.close().then(() => {
          // 分析频谱数据
          const dataArray = new Uint8Array(analyser.frequencyBinCount);
          analyser.getByteFrequencyData(dataArray);

          // 将频谱数据转换为字符串
          const fingerprint = Array.from(dataArray).join(',');
          console.log('Audio Fingerprint:', fingerprint);

          // 在这里可以对 `fingerprint` 进行哈希处理
          // 例如,将其传递到某个指纹识别服务或者进行存储
      });
  }, 1000); // 振荡器工作1秒
}


function getCompleteFingerprint() {
const screenWidth = screen.width;
const screenHeight = screen.height;
const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
const platform = navigator.platform

return btoa(screenWidth + screenHeight + timezone + platform);
}


// 调用函数生成音频指纹
generateAudioFingerprint();

const CanvasFingerprint = getCanvasFingerprint()
const CompleteFingerprint = getCompleteFingerprint()

const WebGLFingerprint = getWebGLFingerprint();

document.getElementById('root').innerHTML = `
  <h2>指纹</h2>
  <b>Canvas:</b><p> ${CanvasFingerprint} <br><p>
  <b>WebGL:</b><p> ${WebGLFingerprint}<br><p>
  <b>dev:</b><p> ${CompleteFingerprint} <br><p>
  </br>
  `


http://www.kler.cn/a/385730.html

相关文章:

  • js导入导出
  • Tomcat 8.5 源码导读
  • JavaSE常用API-日期(计算两个日期时间差-高考倒计时)
  • HARCT 2025 分论坛4:智能系统传感、传感器开发和数据融合中的智能数据分析
  • ROS进阶:使用URDF和Xacro构建差速轮式机器人模型
  • Unity中HDRP设置抗锯齿
  • 拷贝构造(详解)
  • StarUML建模工具安装学习与汉化最新零基础详细教程【一键式下载】(适用于Windows、MacOS系统、Linux系统)
  • 哈尔滨等保测评常见误区破解:避免陷入安全盲区
  • 【人工智能】10分钟解读-深入浅出大语言模型(LLM)——从ChatGPT到未来AI的演进
  • 2024.6月GESP一级真题讲解(含视频讲解)
  • Spring学习笔记_28——事务
  • 【Qt】Macbook M1下载安装
  • 数据分析-43-时间序列预测之深度学习方法GRU
  • 【TS】九天学会TS语法——6.TypeScript泛型图文详解
  • 【Django】创建应用
  • Quartus Prime的应用
  • CentOS操作系统安装过程简介
  • Flutter 中 Provider 的使用指南
  • Python爬虫与Web渗透测试入门指南——初学者防踩雷
  • 现代Web开发:React Router 深度解析
  • MRCTF2020:千层套路
  • docker拉取和打包多个镜像
  • ros入门:参数服务器通信
  • pytorch torch.tile用法
  • 读取excel并且显示进度条