fingerprint2生成的使用者指紋重複踩坑

範兒發表於2019-01-31

fingerprint2 一款開源裝置指紋採集器,在github上有7k的Star,看起來是那麼的讓人放心,今天聊一聊我們在使用這個庫中猜到的坑。

本篇所講的fingerprint2版本為2.0.6

生成的指紋大面積重複問題!!!

生成的指紋大面積重複問題!!!

生成的指紋大面積重複問題!!!

重要的問題講三次。

fingerprint2會取的裝置資訊

*獲取不到值時返回: not available #獲取不到值時返回: error

  1. userAgent:navigator.userAgent
  2. language : 語言
  3. colorDepth: 返回目標裝置或緩衝器上的調色盤的位元深度 screen.colorDepth *
  4. deviceMemory: 以千兆位元組為單位返回裝置記憶體量。該值是通過舍入到最接近的2的冪並將該數除以1024而給出的近似值。連結 *
  5. pixelRatio: 畫素比 devicePixelRatio *
  6. hardwareConcurrency:navigator.hardwareConcurrency返回可用於執行在使用者的計算機上的執行緒的邏輯處理器的數量 *
  7. screenResolution: 檢測螢幕寬高,並根據螢幕方向矯正返回值[width,height]
  8. availableScreenResolution:返回螢幕解析度[width,height],無頭瀏覽器無法獲取。*
  9. timezoneOffset: 返回從當前區域設定(主機系統設定)到UTC的時區差異(以分鐘為單位)連結
  10. timezone:時區 *
  11. sessionStorage: 是否支援sessionStorage,不支援時返回錯誤 #
  12. localStorage: 是否支援localStorage #
  13. indexedDb:是否支援indexedDb #
  14. addBehavior:此時可能未定義body或以程式設計方式刪除
  15. openDatabase: 返回是否支援Web SQL
  16. cpuClass:返回瀏覽器系統的 CPU 等級,一般無法獲取 *
  17. platform: 返回表示瀏覽器平臺的字串,該規範允許瀏覽器始終返回空字串,因此不要依賴此屬性來獲得可靠的答案.連結 *
  18. doNotTrack: 返回使用者的“不跟蹤”設定。如果使用者請求不被網站,內容或廣告跟蹤,則為“1”。一般結果為*
  19. plugins:返回瀏覽器安裝的外掛列表。*
  20. canvas: 如果瀏覽器支援canvas則返回生成baes64資料。*
  21. webgl:返回瀏覽器對webgl繪圖協議的支援情況彙總 *
  22. webglVendorAndRenderer: 返會顯示卡型號相關資訊 *
  23. adBlock:返回是否安裝去廣告外掛。
  24. hasLiedLanguages: 返回使用者是否改變了首選語言
  25. hasLiedResolution:返回使用者是否改變了解析度
  26. hasLiedOs:返回使用者是否改變了作業系統
  27. hasLiedBrowser:返回使用者是否改變了瀏覽器
  28. touchSupport: 返回最大觸控點數,是否支援touch,是否支援ontouchstart事件]
  29. fonts:返回從64種字型種篩選出的可用字型
  30. fontsFlash:Flash字型列舉,如果沒有swfobject,不會觸發。
  31. audio: 返回音訊指紋
  32. enumerateDevices:navigator.mediaDevices 請求可用媒體輸入和輸出裝置的列表,例如麥克風,相機,耳機等

工作邏輯

  1. 取到以上值後[陣列],將陣列轉為值字串
  2. 將取到的字串做為key 傳入x64hash128方法,生成指紋

指紋重複原因

x64hash128演算法是固定的,所以在key相同的時,生成的指紋是相同的。 fingerprint2在手機上重複的概率會更高,絕大多數使用者不會去修改手機的配置,所以重複指紋主要在發生在同一型號的產品。

推薦解決生成指紋重複方案

因為我們主要面對移動終端使用者,所以fingerprint2生成的值出現大面積重複(實踐中的血與淚)。

  • 通過介面獲取使用者ip值
  • FingerPrint2繼續使用預設配置,在傳入的key中手動新增Ip條件;
    Fingerprint2.get(components=>{
         components.push({
            key:'ip',
            value:'192.168.1.1' //通過介面獲取的到ip
          });
        let murmur = Fingerprint2.x64hash128(components.join(""), 31); //生成指紋資訊
    })
    複製程式碼

加入ip資訊,可以在很大程度上規避同型號的產品生成指紋資訊相同的場景,切記不是百分之百。比如同一型號裝置在同一wifi下生成的指紋資訊也是有很大概率相同的。

結言

現在瀏覽器提供的裝置資訊越來越少,跟蹤使用者資訊這只是一個思路,如果大家有奇技淫巧,歡迎交流。

相關文章