FingerprintJS中有意思的知識
當前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
FingerprintJS之前有后端小哥問道,前端可否生成瀏覽器唯一標識UUID,發(fā)給后端處理。當時我想都不用想,直接拒絕(手動狗頭)。后來想了想,這是個不錯了研究題材,就google了一把,于是乎發(fā)現(xiàn)了這個寶藏庫(FingerprintJS)。它能夠生成瀏覽器唯一標識來區(qū)別不同的用戶,pro版本的識別率高達99.5%(然而開源版本只有60%,本文簡述的是開源版本)。 FingerprintJS 原理FingerprintJS 的實現(xiàn)思路挺簡單的,首先找出能區(qū)分瀏覽器不同的部分,我們最常見的就是通過 // FingerprintJS 細化了各個不同的部分 export const sources = { // Expected errors and default values must be handled inside the functions. Unexpected errors must be thrown. osCpu: getOsCpu, languages: getLanguages, colorDepth: getColorDepth, deviceMemory: getDeviceMemory, screenResolution: getScreenResolution, availableScreenResolution: getAvailableScreenResolution, hardwareConcurrency: getHardwareConcurrency, timezoneOffset: getTimezoneOffset, timezone: getTimezone, sessionStorage: getSessionStorage, localStorage: getLocalStorage, indexedDB: getIndexedDB, openDatabase: getOpenDatabase, cpuClass: getCpuClass, platform: getPlatform, plugins: getPlugins, canvas: getCanvasFingerprint, // adBlock: isAdblockUsed, // https://github.com/fingerprintjs/fingerprintjs/issues/405 touchSupport: getTouchSupport, fonts: getFonts, audio: getAudioFingerprint, pluginsSupport: getPluginsSupport, productSub: getProductSub, emptyEvalLength: getEmptyEvalLength, errorFF: getErrorFF, vendor: getVendor, chrome: getChrome, cookiesEnabled: areCookiesEnabled, } FingerprintJS 把各個部分當成組件分別實現(xiàn),然后使用 上面的一大坨組件,其實大部分都是查詢navigator對象的,這里就不展開了,除此之外,canvas指紋,字體差和所用到了hash算法倒是有點意思。 canvas指紋canvas指紋是指:通過canvas接口在頁面上繪制一個隱藏的圖像,在不同的系統(tǒng),瀏覽器中最終的圖像是存在像素級別的差別的,主要是因為操作系統(tǒng)各自使用了不同的設(shè)置和算法來進行抗鋸齒和子像素渲染操作。即使相同的繪圖操作,產(chǎn)生的圖片數(shù)據(jù)的CRC檢驗也不相同。(CRC是指使用canvas.toDataURL返回的base64數(shù)據(jù)中,最后一段32位的驗證碼)。 canvas指紋并不少見,除此之外,還有使用音頻指紋,甚至使用WebGL指紋和WebGL指紋的。 音頻指紋跟canvas指紋的原理差不多,都是利用硬件或軟件的差異,前者生成音頻,后者生成圖片,然后計算得到不同哈希值來作為標識。音頻指紋的生成方式有兩種:
系統(tǒng)字體FingerprintJS 通過
// creates a span and load the font to detect and a base font for fallback const createSpanWithFonts = (fontToDetect: string, baseFont: string) => { return createSpan(`'${fontToDetect}',${baseFont}`) }
// checks if a font is available const isFontAvailable = (fontSpans: HTMLElement[]) => { return baseFonts.some( (baseFont, baseFontIndex) => fontSpans[baseFontIndex].offsetWidth !== defaultWidth[baseFont] || fontSpans[baseFontIndex].offsetHeight !== defaultHeight[baseFont], ) } murmurHash3
MurmurHash是一種經(jīng)過廣泛測試且速度很快的非加密哈希函數(shù)。它有Austin Appleby于2008年創(chuàng)建,并存在多種變體,名字來自兩個基本運算,即multiply(乘法)和rotate(旋轉(zhuǎn))(盡管該算法實際上使用shift和xor而不是rotate)。 MurmurHash3可以產(chǎn)生32位或128位哈希,舊版本MurmurHash2產(chǎn)生32位或64位值,MurmurHash2A變體添加了Merkel-Damgard構(gòu)造,以便可以逐步調(diào)用它。MurmurHash64A針對64位處理器進行了優(yōu)化,針對32位處理器進行MurmurHash64B優(yōu)化。 該文章在 2023/8/4 0:59:24 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |