REST API 的指紋驗證機制

前端或者客戶端涉及數據相關的請求都是不安全的,從某種意義上只能通過一些手段降低請求不被容易使用。本來來介紹一種基于 JWT 的指紋機制。
關于 JWT 令牌機制就不詳細介紹了。在 JWT 令牌中包含系統 JWT 指紋可以帶來安全改進,而不會給用戶帶來任何不便。
什么是瀏覽器指紋識別?
瀏覽器指紋識別背后的思路是收集有關瀏覽器及其環境的信息以進行識別。這些屬性包括瀏覽器類型和版本、操作系統、語言、時區、活動插件、安裝的字體、屏幕分辨率、CPU 級別、設備內存和各種其他設置。這些屬性被連接成一個長字符串,指紋被定義為該字符串的哈希值。
可能會問這些瀏覽器指紋有多獨特,重復性會很大。事實證明,它們在大多數情況下是獨一無二的。如果瀏覽器指紋碰巧不是唯一的,則可以通過將其與設備的 IP 地址相結合來使其唯一。
指紋實現思路
在 REST API 請求系統中可以通過很多參數來識別,而可以作為指紋的可以是一下信息,而這些信息大部分是在請求頭里面:
IP地址:IP地址以及國家/地區、ISP、組織或 ASN 編號等,詳細可以參閱 https://ipwhois.app/json/8.8.8.8User agent:前端請求設備信息Language:用戶使用的語言sec-ch-ua
根據需要 JWT 指紋的敏感度,來取決組合創建指紋的參數數量。這里提供一種參考的組合:
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
對應的參數:
ip : sec-ch-ua : user-agent : accept-language : upgrade-insecure-req
所以現在有了一個指紋,它是在請求 JWT 令牌的同時生成的。可以根據特定用例添加或刪除其中的元素。通常,可能將 IP 地址替換為國家/地區、ISP、組織、ASN 號碼,或者將其刪除并僅使用已知的標頭信息。
將這些信息通過一個序列方式拼接為字符串,然后進行 MD5 轉換,通常如下:
5dc9db757608b61e3a04bd1e08dd25c3
將生成的指紋添加到 JSON Payload 中。
總結
這里只是提供了一種簡單的思路,但這不能完全避免非法的無效請求,只是增加了獲取模擬請求的難度。為了提高指紋的唯一性,需要增加一些獨特的屬性數據。