Jwt

JSON Web 令牌的正確格式/符號是什麼?

  • November 23, 2022

JSON Web Token 應該具有以下格式:

token = encodeBase64(header) + '.' + encodeBase64(payload) + '.' + encodeBase64(signature)

當我使用 jsonwebtoken node.js 函式創建令牌時:

jsonwebtoken.sign({username : "admin", password : "admin"}, publicKey, { algorithm:'HS256' });

它產生以下輸出:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJhZG1pbiIsImlhdCI6MTY2OTIxMDE0MH0.Cj2-vgNkw2xChXMe5YjIrH9UYH6-pL7ArSERBVJO-zE

解碼標頭時,您會得到:

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

但是解碼有效負載會產生填充錯誤,因為填充已被省略。僅當有效負載更改為(添加了正確數量的“=”)時:

eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJhZG1pbiIsImlhdCI6MTY2OTIxMDE0MH0=

它是否正確解碼為:

'{"username":"admin","password":"admin","iat":1669210140}'

並且簽名無法解碼,因為它包含多個’-’,這是一個無效的base64字元。

我的問題是:

如果每個部分都是 base64 編碼的,那麼為什麼要從有效載荷中省略填充,簽名的奇怪語法是什麼?

我嘗試在jsonwebtoken GitHub 儲存庫上查找資訊,但找不到解釋。

編輯:經過更多研究後,我發現 JWT 使用 Base64URL 編碼,而不是 Base64 編碼。一旦我有更多資訊,將更新這篇文章。

JWT 不是以普通 Base64 編碼,而是以Base64url編碼。對於這個版本,填充是可選的,它使用不同的字元集:“-”而不是“+”和“_”而不是“/”。

資料來源:

https://jwt.io/introduction https://en.wikipedia.org/wiki/Base64#Variants_summary_table

引用自:https://crypto.stackexchange.com/questions/102924