題解 P3403 【跳樓機】
阿新 • • 發佈:2020-11-01
jwt原理
最簡單理解:jwt本質就是, 把使用者資訊通過加密後生成的一個字串
JWT的原則是在伺服器身份驗證之後,將生成一個JSON物件並將其傳送回用戶
{
"UserName": "Chongchong",
"Role": "Admin",
"Expire": "2018-08-08 20:15:56"
}
之後,當用戶與伺服器通訊時,客戶在請求中發回JSON物件,伺服器僅依賴於這個JSON物件來標識使用者。
為了防止使用者篡改資料,伺服器將在生成物件時添加簽名(有關詳細資訊,請參閱下文)。
伺服器不儲存任何會話資料,即伺服器變為無狀態,使其更容易擴充套件
jwt的資料結構
1)jwt頭:JWT頭部分是一個描述JWT元資料的JSON物件
2)有效載荷:七個預設欄位+自定義私有欄位(使用者資訊)
3)簽名=HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload) ,secret)
JWT頭
base64UrlEncode(header) --->字串
# JWT頭部分是一個描述JWT元資料的JSON物件,通常如下所示。 { "alg": "HS256", "typ": "JWT" } # 1)alg屬性表示簽名使用的演算法,預設為HMAC SHA256(寫為HS256); # 2)typ屬性表示令牌的型別,JWT令牌統一寫為JWT。 # 3)最後,使用Base64 URL演算法將上述JSON物件轉換為字串儲存。
第二部分: 有效載荷 沒有敏感資料的使用者資訊
base64UrlEncode(payload) --->字串
#1、有效載荷部分,是JWT的主體內容部分,也是一個JSON物件,包含需要傳遞的資料。 JWT指定七個預設 欄位供選擇。 ''' iss:發行人 exp:到期時間 sub:主題 aud:使用者 nbf:在此之前不可用 iat:釋出時間 jti:JWT ID用於標識該JWT ''' #2、除以上預設欄位外,我們還可以自定義私有欄位,如下例: { "sub": "1234567890", "name": "chongchong", "admin": true } #3、注意 預設情況下JWT是未加密的,任何人都可以解讀其內容,因此不要構建隱私資訊欄位,存放保密資訊,以防 止資訊洩露。 JSON物件也使用Base64 URL演算法轉換為字串儲存。
第三部分: 簽名雜湊
簽名=HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload) ,secret)
# 1.簽名雜湊部分是對上面兩部分資料簽名,通過指定的演算法生成雜湊,以確保資料不會被篡改。
# 2.首先,需要指定一個密碼(secret),該密碼僅僅為儲存在伺服器中,並且不能向用戶公開。
# 3.然後,使用標頭中指定的簽名演算法(預設情況下為HMAC SHA256)根據以下公式生成簽名。
# 4.HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secret)
# 5.在計算出簽名雜湊後,JWT頭,有效載荷和簽名雜湊的三個部分組合成一個字串,每個部分用"."分
隔,就構成整個JWT物件。