如何防范 Token 遭遇偽造、篡改與竊取?—— 安全性問題全解析
引言
隨著IT和互聯網的發展,從國家到企業,網絡安全成為數字經濟安全的重要內容,是一項每天、長期都要面對的問題。稍大一點的公司每年也都會有護網行動。
隨著技術的發展,Token的安全性已成為一個至關重要的議題,Token不僅被廣泛用于用戶身份驗證,還承擔著會話管理等關鍵任務。本文我們就來聊一聊防范偽造、篡改、竊取問題的解決方案。
JWT
提到token,就不得不提到JWT。
什么是JWT
Json web token (JWT), 是為了在網絡應用環境間傳遞聲明而執行的一種基于JSON的開放標準(RFC 7519)。該token被設計為緊湊且安全的,特別適用于分布式站點的單點登錄(SSO)場景。JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便于從資源服務器獲取資源,也可以增加一些額外的其它業務邏輯所必須的聲明信息,該token也可直接被用于認證,也可被加密。
保證安全的前提,我們先來了解下JWT的起源以及Token的原理
為什么會出現Token-和傳統的session認證的區別?
傳統的session認證
我們知道,http協議本身是一種無狀態的協議,而這就意味著如果用戶向我們的應用提供了用戶名和密碼來進行用戶認證,那么下一次請求時,用戶還要再一次進行用戶認證才行,因為根據http協議,我們并不能知道是哪個用戶發出的請求,所以為了讓我們的應用能識別是哪個用戶發出的請求,我們只能在服務器存儲一份用戶登錄的信息,這份登錄信息會在響應時傳遞給瀏覽器,告訴其保存為cookie,以便下次請求時發送給我們的應用,這樣我們的應用就能識別請求來自哪個用戶了,這就是傳統的基于session認證。
但是這種基于session的認證使應用本身很難得到擴展,隨著不同客戶端用戶的增加,獨立的服務器已無法承載更多的用戶,而這時候基于session認證應用的問題就會暴露出來.
基于session認證所顯露的問題
Session: 每個用戶經過我們的應用認證之后,我們的應用都要在服務端做一次記錄,以方便用戶下次請求的鑒別,通常而言session都是保存在內存中,而隨著認證用戶的增多,服務端的開銷會明顯增大。
擴展性: 用戶認證之后,服務端做認證記錄,如果認證的記錄被保存在內存中的話,這意味著用戶下次請求還必須要請求在這臺服務器上,這樣才能拿到授權的資源,這樣在分布式的應用上,相應的限制了負載均衡器的能力。這也意味著限制了應用的擴展能力。
CSRF:因為是基于cookie來進行用戶識別的,cookie如果被截獲,用戶就會很容易受到跨站請求偽造的攻擊。
Token的鑒權機制是怎樣的
圖片
基于token的鑒權機制類似于http協議也是無狀態的,它不需要在服務端去保留用戶的認證信息或者會話信息。這就意味著基于token認證機制的應用不需要去考慮用戶在哪一臺服務器登錄了,這就為應用的擴展提供了便利。
流程上是這樣的:
- 用戶使用用戶名密碼來請求服務器
- 服務器進行驗證用戶的信息
- 服務器通過驗證發送給用戶一個token
- 客戶端存儲token,并在每次請求時附送上這個token值
- 服務端驗證token值,并返回數據
這個token必須要在每次請求時傳遞給服務端,它應該保存在請求頭里, 另外,服務端要支持CORS(跨來源資源共享)策略,一般我們在服務端這么做就可以了Access-Control-Allow-Origin: *。
Token的安全問題
Token的安全威脅
竊取攻擊
重放攻擊
重放攻擊是另一種常見的威脅,攻擊者可以通過截獲Token并重新發送來模擬合法用戶的請求。這種攻擊可能導致未經授權的操作,例如執行惡意操作或者獲取未授權的資源。為了防止重放攻擊,開發人員可以采用一些策略,如為Token設置短暫的有效期,并使用一次性的隨機數或時間戳來增加Token的復雜度,使其難以被重復使用。
這里要強調下重放攻擊,他往往不容易被察覺,因為他拿到了一個有效的token,但是他危害性 又很大,輕則流量打滿,系統不可用,重則經濟損失。
偽造攻擊
Token的安全性方案
使用HTTPS
確保所有與Token相關的通信都通過HTTPS協議進行加密傳輸。HTTPS提供了端到端的加密,可以防止中間人攻擊和竊取Token的威脅。使用SSL/TLS證書對通信進行加密,確保Token在傳輸過程中不會被竊取或篡改。
Token加密
對于敏感信息或者需要保護的Token內容,采用加密算法進行加密處理是一種有效的方式。通過加密Token內容,即使Token被竊取,攻擊者也無法解析其中的信息。使用強大的加密算法如AES或者RSA來加密Token,確保其內容在存儲和傳輸過程中的安全性。
安全的Token存儲
在客戶端和服務器端安全地存儲Token是至關重要的。避免將Token存儲在不安全的地方,如瀏覽器的本地存儲或者未加密的數據庫中。建議將Token存儲在安全的存儲介質中,如加密的本地存儲或者安全的數據庫中,并采取措施限制對Token的訪問權限。
設置合理的Token過期時間
通過設置合理的Token有效期來限制Token的使用時間,可以減少Token被濫用的風險。根據應用程序的需求和安全策略,設置Token的有效期,建議不要過長,通常幾分鐘到幾小時為宜。定期更新Token并且及時使其過期可以有效地減少Token被攻擊者利用的機會。
使用雙因素認證
在關鍵操作中使用雙因素認證可以增加用戶身份驗證的安全性。當用戶進行重要操作時,要求用戶除了提供Token外,還需要進行另一種身份驗證,如短信驗證碼、硬件令牌或生物識別等。這樣可以大大提高系統的安全性,即使Token被盜取,攻擊者也無法完成關鍵操作。
安全地刷新Token
安全地刷新Token是確保用戶會話持續有效的關鍵步驟
定期刷新
設置合理的Token過期時間,并在Token即將過期之前進行刷新。通常,可以在Token過期前的一段時間內發起刷新請求,以確保用戶會話的連續性。
驗證用戶身份
在刷新Token時,要求用戶重新進行身份驗證,以確保請求來自合法用戶。可以要求用戶提供密碼、指紋、短信驗證碼等額外的身份驗證信息,以確認用戶身份的真實性。
限制刷新次數
為了防止惡意攻擊者濫用Token刷新功能,可以限制Token的刷新次數和頻率。設定合理的刷新頻率和最大刷新次數,防止攻擊者利用刷新功能進行暴力破解或濫用。
使用安全通道
在刷新Token時,要求使用安全的通信渠道,如HTTPS協議,確保Token刷新請求的安全性和完整性。避免在不安全的網絡環境下進行Token刷新操作,以防止Token被竊取或篡改。
更新相關會話信息
在刷新Token的同時,更新相關的會話信息,如會話標識、用戶權限等。確保會話信息與新頒發的Token保持同步,以防止出現會話不一致或權限錯誤的情況。
總結
應對安全問題,我們需要多舉措并行。
- 除了我們的技術方案制定上要充分考慮安全性的設計,還要不斷地與時俱進,在不斷演變的網絡安全環境中,不斷提高我們的安全能力,完善我們的技術方案。
- 產品方案設計時,在關鍵節點增加雙因子認證環節。
- 建立安全測試機制,有條件的都是建立專業的安全測試團隊或者請外部的安全測試公司定期/不定期的進行網絡安全掃描,能夠及時的發現安全問題以便于及時修復
- 不斷完善監控預警機制。通過訪問日志記錄、異常行為檢測、實時監控工具等措施,及時發現異常情況,減少損失。