JWT加密原理


JWT加密原理

JWT:

JSON Web Token的縮寫,是REST接口的一種安全策略,也是一種安全的規范,使用JWT可以讓我們在用戶端和服務端建立一種可靠的通信保障。

 

使用簡介:

用戶端登錄成功后,服務器會生成一個token給到用戶端,token里面包含用戶信息(用戶id),用戶后續攜帶該token進行請求訪問,服務器從用戶的請求中成功解析token信息,則說明用戶的請求合法有效,反之服務器從token解析不出用戶信息就認為請求非法失效。

 

優點:

在分布式系統中,可以有效的解決單點登錄問題以及SESSION共享問題;服務器不保存token或者用戶session信息,可以減少服務器壓力。

缺點:

沒有失效策略;設置失效時間后,只能等待token過期,無法改變token里面的失效時間

 

組成:

一個JWT是有三個部門組成:頭部(header),消息體(playload),簽名(sign)。

 

詳細說明:

頭部(header):

{ "typ": "JWT", "alg": "HS256" }  

typ是type的縮寫,說明類型是JWT,alg是加密加密方式為HS256。上面的內容用BASE64加密后的內容如下:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

 

消息體(playload):

該部分是實際存放信息的地方,JSON格式如下:

{ "iss": "why", "iat": 1416797419, "exp": 1448333419, "aud": "www.example.com", "sub": "taobao.com", }

iss: 該JWT的簽發者,是否使用是可選的;
sub: 該JWT所面向的用戶,是否使用是可選的;
aud: 接收該JWT的一方,是否使用是可選的;
exp(expires): 什么時候過期,這里是一個Unix時間戳,是否使用是可選的;
iat(issued at): 在什么時候簽發的(UNIX時間),是否使用是可選的;
nbf (Not Before):如果當前時間在nbf里的時間之前,則Token不被接受;一般都會留一些余地,比如幾分鍾;,是否使用是可選的。
同樣,上面的內容用BASE64加密后如下;

ewogICJpc3MiOiAid2h5IiwgCiAgImlhdCI6IDE0MTY3OTc0MTksIAogICJleHAiOiAxNDQ4MzMzNDE5LCAKICAiYXVkIjogInd3dy5leGFtcGxlLmNvbSIsIAogICJzdWIiOiAidGFvYmFvLmNvbSIsIAp9

 

簽名(sign):

簽名是對頭部和消息體的內容進行簽名,即便有人獲取token的內容,改變消息題或者頭部的內容,那么生成的簽名將和現在的簽名不一樣;同時如果不知道服務器加密時用的密鑰的話,得出來的簽名也一定是不一樣的。

簽名的過程:

采用header中聲明的算法,將base64加密后的header、base64加密后的playload以及密鑰(secret)進行計算得到。

如以上要簽名的內容為:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.ewogICJpc3MiOiAid2h5IiwgCiAgImlhdCI6IDE0MTY3OTc0MTksIAogICJleHAiOiAxNDQ4MzMzNDE5LCAKICAiYXVkIjogInd3dy5leGFtcGxlLmNvbSIsIAogICJzdWIiOiAidGFvYmFvLmNvbSIsIAp9

采用header聲明的HS256算法進行加密,同時提供一個密鑰(secret),計算簽名后的內容:

6OcLdX38eKWn1gCyJ6RNwsAvIvXxYq1CGBkFWgiTsyc
最后將三者拼接在一起就是JWT:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.ewogICJpc3MiOiAid2h5IiwgCiAgImlhdCI6IDE0MTY3OTc0MTksIAogICJleHAiOiAxNDQ4MzMzNDE5LCAKICAiYXVkIjogInd3dy5leGFtcGxlLmNvbSIsIAogICJzdWIiOiAidGFvYmFvLmNvbSIsIAp9.6OcLdX38eKWn1gCyJ6RNwsAvIvXxYq1CGBkFWgiTsyc

 

解密:

后端服務校驗jwtToken是否有權訪問接口服務,進行解密認證,如校驗訪問者的userid,首先 
用將字符串按.號切分三段字符串,分別得到header和playload和sign。然后將header.playload拼裝用密鑰和HAMC SHA-256算法進行加密然后得到新的字符串和sign進行比對,如果一樣就代表數據沒有被篡改,然后從頭部取出exp對存活期進行判斷,如果超過了存活期就返回空字符串,如果在存活期內返回userid的值。

 

安全性:

JWT的header和playload都是簡單的使用base64加密的, 可以解密獲取里面的內容,所以通過http傳輸不安全。

1.使用https進行ssl加密傳輸,保證通道安全;

2.playload中盡量不要放置敏感信息,只保存用戶唯一標實即可。

 

參考:

https://blog.csdn.net/why15732625998/article/details/78534711

https://www.cnblogs.com/royalluren/p/11041888.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM