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