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);
}

浙公網安備 33010602011771號