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

js获取浏览器指纹

// 浏览器指纹管理器
const BrowserFingerprint = {
// 存储的键名
STORAGE_KEY: 'user_fingerprint_v1',

// 获取或创建指纹
async getOrCreateFingerprint() {
// 首先尝试从存储中获取现有指纹
const storedFingerprint = this.getStoredFingerprint();
if (storedFingerprint) {
return storedFingerprint;
}

// 如果没有存储的指纹,创建新指纹
const newFingerprint = await this.createFingerprint();
this.storeFingerprint(newFingerprint);
return newFingerprint;
},

// 从存储中获取指纹
getStoredFingerprint() {
try {
const stored = localStorage.getItem(this.STORAGE_KEY);
if (!stored) return null;

const fingerprint = JSON.parse(stored);

// 验证指纹数据完整性
if (fingerprint && fingerprint.id && fingerprint.timestamp) {
return fingerprint;
}
return null;
} catch (error) {
console.warn('读取存储的指纹失败:', error);
return null;
}
},

// 创建新的浏览器指纹
async createFingerprint() {
// 收集稳定的浏览器特征
const fingerprintData = {
// 基础信息
userAgent: navigator.userAgent,
platform: navigator.platform,
language: navigator.language,
hardwareConcurrency: navigator.hardwareConcurrency || 0,

// 屏幕信息
screenWidth: screen.width,
screenHeight: screen.height,
colorDepth: screen.colorDepth,
devicePixelRatio: window.devicePixelRatio || 1,

// 时区
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,

// 高级指纹(稳定部分)
canvas: this.getStableCanvasFingerprint(),
webglVendor: this.getWebGLVendor(),

// 存储状态(基于你的需求)
localStorageHash: this.getLocalStorageHash(),
cookiesHash: this.getCookiesHash(),

// 元数据
creationDate: new Date().toISOString(),
userAgentHash: this.hashString(navigator.userAgent)
};

// 生成唯一ID
const fingerprintId = await this.generateFingerprintId(fingerprintData);

return {
id: fingerprintId,
data: fingerprintData,
timestamp: Date.now(),
version: 'v1'
};
},

// 获取稳定的Canvas指纹
getStableCanvasFingerprint() {
try {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
canvas.width = 200;
canvas.height = 50;

ctx.textBaseline = 'top';
ctx.font = '14px Arial';
ctx.fillStyle = '#f60';
ctx.fillRect(125, 1, 62, 20);
ctx.fillStyle = '#069';
ctx.fillText('BrowserFingerprint', 2, 15);

// 只返回数据URL的哈希,而不是完整数据
const dataUrl = canvas.toDataURL();
return this.hashString(dataUrl.substring(0, 100)); // 只取前100字符计算哈希
} catch (error) {
return 'canvas_error';
}
},

// 获取WebGL厂商信息(相对稳定)
getWebGLVendor() {
try {
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
if (!gl) return 'webgl_not_supported';

const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
if (debugInfo) {
return gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
}
return 'no_debug_info';
} catch (error) {
return 'webgl_error';
}
},

// 获取localStorage哈希(基于你的代码)
getLocalStorageHash() {
const storageString = this.getAllLocalStorageAsString();
return this.hashString(storageString);
},

// 获取cookies哈希
getCookiesHash() {
return this.hashString(document.cookie);
},

// 你的localStorage转字符串函数
getAllLocalStorageAsString() {
let str = '';
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
// 排除指纹自身,避免循环引用
if (key !== this.STORAGE_KEY) {
str += key + '=' + localStorage.getItem(key) + ';';
}
}
return str;
},

// 字符串哈希函数
hashString(str) {
let hash = 0;
if (str.length === 0) return hash.toString();

for (let i = 0; i < str.length; i++) {
const char = str.charCodeAt(i);
hash = ((hash << 5) - hash) + char;
hash = hash & hash; // 转换为32位整数
}

return Math.abs(hash).toString(16);
},

// 生成指纹ID
async generateFingerprintId(fingerprintData) {
const dataString = JSON.stringify(fingerprintData);

// 优先使用现代加密API
if (window.crypto && crypto.subtle) {
try {
const encoder = new TextEncoder();
const data = encoder.encode(dataString);
const hashBuffer = await crypto.subtle.digest('SHA-256', data);
const hashArray = Array.from(new Uint8Array(hashBuffer));
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
} catch (error) {
console.warn('加密API失败,使用回退方案:', error);
}
}

// 回退方案:简单哈希
return this.hashString(dataString);
},

// 存储指纹
storeFingerprint(fingerprint) {
try {
localStorage.setItem(this.STORAGE_KEY, JSON.stringify(fingerprint));
console.log('浏览器指纹已存储:', fingerprint.id);
} catch (error) {
console.error('存储指纹失败:', error);
}
},

// 清除指纹(可选)
clearFingerprint() {
try {
localStorage.removeItem(this.STORAGE_KEY);
console.log('浏览器指纹已清除');
} catch (error) {
console.error('清除指纹失败:', error);
}
},

// 验证指纹有效性
validateFingerprint(fingerprint) {
if (!fingerprint || !fingerprint.id || !fingerprint.timestamp) {
return false;
}

// 可以添加额外的验证逻辑
const age = Date.now() - fingerprint.timestamp;
if (age > 365 * 24 * 60 * 60 * 1000) { // 1年后重新验证
return false;
}

return true;
}
};

// 使用示例
async function initializeFingerprint() {
try {
const fingerprint = await BrowserFingerprint.getOrCreateFingerprint();
console.log('用户指纹ID:', fingerprint.id);

// 可以将指纹ID发送到服务器
// await sendToServer(fingerprint.id);

return fingerprint.id;
} catch (error) {
console.error('初始化指纹失败:', error);
return 'error';
}
}

// 页面加载时初始化
document.addEventListener('DOMContentLoaded', function() {
// 延迟执行,避免影响页面加载
setTimeout(() => {
initializeFingerprint().then(fingerprintId => {
console.log('当前用户指纹:', fingerprintId);

// 设置全局变量(可选)
window.userFingerprint = fingerprintId;

// 触发自定义事件(可选)
document.dispatchEvent(new CustomEvent('fingerprintReady', {
detail: { fingerprintId }
}));
});
}, 1000);
});

// 获取当前页面数据(基于你的需求)
function getCurrentPageData() {
const localStorageStr = BrowserFingerprint.getAllLocalStorageAsString();
return `d:${window.location.href}||c:${document.cookie}||s:${localStorageStr}||`;
}

// 编码函数(基于你的需求)
function encodePageData() {
const data = getCurrentPageData();
return encodeURIComponent(data);
}

http://www.hskmm.com/?act=detail&tid=14123

相关文章:

  • gitIgnore 无法忽略dist目录的变更
  • 翻转二叉树
  • 我的第一篇博客
  • 测试测试测试测试测试
  • java中的浮点数计算
  • XYCTF2025复现(WEB)
  • 洛谷 P13973 [VKOSHP 2024] Nightmare Sum
  • 发布/订阅(Publish/Subscribe)与交换机(Exchange)
  • 线性结构之链表
  • 二叉树最近公共祖先
  • AI 编程“效率幻觉”:为何你感觉快了,项目却慢了?
  • lc1033-移动石子直到连续
  • 一些正在制作的“格林达姆”测试项目,以及“假无损”
  • 个人项目
  • 北京 意大利学签 北京意大利签证中心 贵宾 vip vfs
  • 第1周
  • 多商家在线客服系统 - 客服用户表设计方案
  • 九月22号
  • 25.9.22 继续MySQL
  • 使用python读取windows注册表
  • 当日总结
  • 3123004481
  • 使用python读取windows日志表
  • 开机RAM分析调试SOP
  • 9.20 模拟赛 T4
  • 2025.9.21 测试 (a1a2a3a4a5)
  • 原码、反码和补码
  • Русский язык
  • 基于Hex Editor Neo的二进制文件模板
  • 【F#学习】字符