REST API 的指紋驗(yàn)證機(jī)制

前端或者客戶端涉及數(shù)據(jù)相關(guān)的請(qǐng)求都是不安全的,從某種意義上只能通過一些手段降低請(qǐng)求不被容易使用。本來來介紹一種基于 JWT 的指紋機(jī)制。
關(guān)于 JWT 令牌機(jī)制就不詳細(xì)介紹了。在 JWT 令牌中包含系統(tǒng) JWT 指紋可以帶來安全改進(jìn),而不會(huì)給用戶帶來任何不便。
什么是瀏覽器指紋識(shí)別?
瀏覽器指紋識(shí)別背后的思路是收集有關(guān)瀏覽器及其環(huán)境的信息以進(jìn)行識(shí)別。這些屬性包括瀏覽器類型和版本、操作系統(tǒng)、語言、時(shí)區(qū)、活動(dòng)插件、安裝的字體、屏幕分辨率、CPU 級(jí)別、設(shè)備內(nèi)存和各種其他設(shè)置。這些屬性被連接成一個(gè)長字符串,指紋被定義為該字符串的哈希值。
可能會(huì)問這些瀏覽器指紋有多獨(dú)特,重復(fù)性會(huì)很大。事實(shí)證明,它們在大多數(shù)情況下是獨(dú)一無二的。如果瀏覽器指紋碰巧不是唯一的,則可以通過將其與設(shè)備的 IP 地址相結(jié)合來使其唯一。
指紋實(shí)現(xiàn)思路
在 REST API 請(qǐng)求系統(tǒng)中可以通過很多參數(shù)來識(shí)別,而可以作為指紋的可以是一下信息,而這些信息大部分是在請(qǐng)求頭里面:
IP地址:IP地址以及國家/地區(qū)、ISP、組織或 ASN 編號(hào)等,詳細(xì)可以參閱 https://ipwhois.app/json/8.8.8.8User agent:前端請(qǐng)求設(shè)備信息Language:用戶使用的語言sec-ch-ua
根據(jù)需要 JWT 指紋的敏感度,來取決組合創(chuàng)建指紋的參數(shù)數(shù)量。這里提供一種參考的組合:
sec-ch-ua user-agent accept-language upgrade-insecure-requests Ip ASN ORG
這是常見瀏覽器的指紋示例:
192.168.1.250 : “Google Chrome”;v=”89", "Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24" :
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 :
zh-CN,zh;q=0.9,en;q=0.8,ja;q=0.7 : 1
對(duì)應(yīng)的參數(shù):
ip : sec-ch-ua : user-agent : accept-language : upgrade-insecure-req
所以現(xiàn)在有了一個(gè)指紋,它是在請(qǐng)求 JWT 令牌的同時(shí)生成的。可以根據(jù)特定用例添加或刪除其中的元素。通常,可能將 IP 地址替換為國家/地區(qū)、ISP、組織、ASN 號(hào)碼,或者將其刪除并僅使用已知的標(biāo)頭信息。
將這些信息通過一個(gè)序列方式拼接為字符串,然后進(jìn)行 MD5 轉(zhuǎn)換,通常如下:
5dc9db757608b61e3a04bd1e08dd25c3
將生成的指紋添加到 JSON Payload 中。
總結(jié)
這里只是提供了一種簡單的思路,但這不能完全避免非法的無效請(qǐng)求,只是增加了獲取模擬請(qǐng)求的難度。為了提高指紋的唯一性,需要增加一些獨(dú)特的屬性數(shù)據(jù)。