// 浏览器指纹管理器
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);
}