瀏覽器指紋定義
指紋,即我們常說的指紋,比如手指的紋理,每個(gè)人的指紋都是唯一的,所以我們可以用指紋識(shí)別器記錄用戶指紋來唯一判別和認(rèn)證一個(gè)用戶。在網(wǎng)絡(luò)安全領(lǐng)域也會(huì)聽到一些“指紋”的說法,比如,操作系統(tǒng)指紋,網(wǎng)絡(luò)設(shè)備指紋等等。“唯一性”和“穩(wěn)定性”奠定了指紋識(shí)別作為一種新型且可靠的追蹤方式的基礎(chǔ)。
1、提出
瀏覽器指紋,是EFF(電子前哨基金會(huì))提出的一項(xiàng)追蹤技術(shù)。瀏覽器指紋技術(shù)可以匿名識(shí)別瀏覽器,并且準(zhǔn)確率高達(dá)94%。EFF通過提取瀏覽器中的8個(gè)獨(dú)立的特征屬性,使用字符串進(jìn)行描述,{ user_agent, plugins, fonts, video, supercookies, http accept, timezone, cookie enabled },有些瀏覽器特征可以通過簡(jiǎn)單的HTTP請(qǐng)求獲得,有些則需要通過AJAX來收集。
每項(xiàng)瀏覽器特征都攜帶不同bit的信息熵,提取的八項(xiàng)瀏覽器特征共包含18.1 bits的信息熵,這意味著在286,777個(gè)指紋中才會(huì)出現(xiàn)一個(gè)與你的瀏覽器相同的瀏覽器指紋。EFF使用Murmur Hash算法對(duì)這些信息進(jìn)行哈希計(jì)算并返回一個(gè)32位字符串,這個(gè)字符串即唯一的瀏覽器指紋。如圖所示:
2、發(fā)展
GitHub上一位用戶根據(jù)EFF發(fā)表的文章,用Javascript實(shí)現(xiàn)了快速的瀏覽器指紋庫——Fingerprintjs,并且之后對(duì)該庫再一次做了些改進(jìn),形成了Fingerprintjs2。作者在改進(jìn)的Fingerprintjs2庫中添加了一些對(duì)新型特征的檢測(cè)以及新型的識(shí)別技術(shù)。
新型的識(shí)別技術(shù)有:
Canvas:HTML5的動(dòng)態(tài)繪圖標(biāo)簽,也是Fingerprintjs2中添加的新型追蹤技術(shù)。由于不同的瀏覽器使用不同的圖像處理引擎,不同的導(dǎo)數(shù)選項(xiàng),不同的壓縮等級(jí),所以不同的電腦繪制出的圖形也會(huì)有不同,而這些不同可以被用來給用戶設(shè)備分配特定編號(hào),即指紋。Canvas的toDataURL()方法返回的是圖片內(nèi)容的base64位編碼字符串,其最后的32位CRC校驗(yàn)碼可以用于用戶的唯一標(biāo)識(shí)。EFF的瀏覽器指紋測(cè)試中沒有截取最后的校驗(yàn)碼,而是對(duì)獲取到的所有base64位編碼hash運(yùn)算壓縮成32位的字符串,即瀏覽器指紋檢測(cè)中的Hash of canvas fingerprint(如上圖所示)。
WebGL:一種3D繪圖標(biāo)準(zhǔn),對(duì)獲取到的瀏覽器的WebGL功能測(cè)試結(jié)果,通過hash運(yùn)算生成32位字節(jié)碼,即Hash of WebGL fingerprint。
3、跟進(jìn)
隨后,EFF在其官方檢測(cè)網(wǎng)站中也使用 Fingerprintjs2作為指紋信息收集模塊(在線瀏覽器指紋監(jiān)測(cè)網(wǎng)址:https://panopticlick.eff.org/ )。下面將詳細(xì)介紹除了新型的識(shí)別技術(shù)以外的瀏覽器指紋收集工作是怎么展開的。
瀏覽器指紋信息
以下是一些指紋特征信息的簡(jiǎn)單示例,以及這些特征的獲取方式:
1、基本屬性
User Agent:指用戶代理,即瀏覽器,包括硬件平臺(tái),系統(tǒng)軟件,應(yīng)用軟件和用戶個(gè)人偏好等信息。User Agent是瀏覽器navigator對(duì)象的一個(gè)屬性,可通過navigator.userAgent獲取瀏覽器信息。根據(jù)User Agent信息可以判斷用戶所使用的瀏覽器及版本等信息,不同的瀏覽器的信息也有很大的不同
Platform:代表用戶使用的瀏覽器所在的平臺(tái),可通過navigator.platform獲取。
Language:代表瀏覽器當(dāng)前使用的語言。可通過navigator.language獲取。
Screen Size:即瀏覽器分辨率,屏幕分辨率可由screen.width(屏幕的寬)以及screen,height(屏幕的高)組合得到。同理,Color Depth是瀏覽器的色彩深度,可由screen.colorDepth屬性獲取到。
Time Zone:Javascript的Data對(duì)象的getTimezoneOffset() 函數(shù)用于返回協(xié)調(diào)通用時(shí)間(UTC)與當(dāng)前主機(jī)時(shí)間之間的分鐘差值。
2、檢測(cè)類屬性
Are Cookie Enabled? :瀏覽網(wǎng)站為用戶設(shè)置Cookie,通過返回的Cookie值可以判斷用戶是否禁用Cookie。
DNT header Enabled?:檢測(cè)用戶瀏覽器是否設(shè)置“禁止追蹤”(Do Not Track)來避免被第三方網(wǎng)站追蹤網(wǎng)絡(luò)痕跡。navigator.doNotTrack的值代表著用戶對(duì)瀏覽器的不同設(shè)置。
Limited supercookie test : 通過HTML5的localStorage和sessionStorage屬性檢測(cè)瀏覽器是否支持本地存儲(chǔ)。IE的userData對(duì)象可以檢測(cè)是否在瀏覽器客戶端設(shè)置了永久性的會(huì)話數(shù)據(jù)。
Touch Support:對(duì)觸屏功能進(jìn)行檢測(cè),通過檢測(cè)navigator.maxTouchPoints以及TouchEvent對(duì)象和ontouchstart事件,綜合判斷瀏覽器是否支持觸屏操作,判斷瀏覽器終端是PC端或是移動(dòng)端。
Browser Plugin Details:使用ActiveXObject對(duì)象對(duì)IE瀏覽器的插件進(jìn)行檢測(cè),對(duì)非IE瀏覽器通過navigator.plugins屬性獲取瀏覽器的插件列表。
System fonts:通過檢測(cè)Flash的window.swfobje和swfobject.hasFlashPlayerVersion()等屬性和方法來檢測(cè)字體。如果瀏覽器不支持Flash,則使用JS對(duì)字體進(jìn)行枚舉檢測(cè)。
展望
當(dāng)然瀏覽器指紋也存在自身的弊端,用戶瀏覽器特征信息的變化都會(huì)造成指紋的改變。比如瀏覽器的升級(jí)以及插件的安裝。同一用戶瀏覽器指紋的不一致是與Cookie相比之下的缺陷,即“穩(wěn)定性”不夠好。EFF在其網(wǎng)站測(cè)試中對(duì)每一個(gè)瀏覽的用戶設(shè)定一個(gè)Cookie值,用于輔助檢測(cè)。除了設(shè)定Cookie作為用戶標(biāo)識(shí)之外,最近幾年的一些研究一直在探尋能夠有效關(guān)聯(lián)同一用戶的不同階段的指紋值的方法,瀏覽器指紋取代Cookie或許指日可待。
該文章在 2022/7/15 9:34:32 編輯過