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