深入了解 Json Web Token 之概念篇
本文作者NinthDevilHunster,轉(zhuǎn)載請(qǐng)注明來(lái)自FreeBuf.COM

以下,可能你能夠在各大網(wǎng)站上搜到,但是對(duì)于JWE 的內(nèi)容,卻鮮有見(jiàn)聞。下文是我讀了json web token handle book后,用自己的理解寫(xiě)下的。主要參考文本 JWT Hand Book,部分文字翻譯自該手冊(cè)。
什么是 JWT
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQJWT 解決什么問(wèn)題?
JWT 的一些名詞解釋
JWT的組成
xxxxx.yyyyy.zzzzz的樣式。JWT header
{
??"typ": "JWT",
??"alg": "none",
??"jti": "4f1g23a12aa"
}base64UrlEncode(header)
>>?eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQ
JWT payload
{
??"iss": "http://shaobaobaoer.cn",
??"aud": "http://shaobaobaoer.cn/webtest/jwt_auth/",
??"jti": "4f1g23a12aa",
??"iat": 1534070547,
??"nbf": 1534070607,
??"exp": 1534074147,
??"uid": 1,
??"data": {
????"uname": "shaobao",
????"uEmail": "[email protected]",
????"uID": "0xA0",
????"uGroup": "guest"
??}
}iss? 【issuer】發(fā)布者的url地址 sub 【subject】該JWT所面向的用戶,用于處理特定應(yīng)用,不是常用的字段 aud 【audience】接受者的url地址 exp 【expiration】 該jwt銷(xiāo)毀的時(shí)間;unix時(shí)間戳 nbf ?【not before】 該jwt的使用時(shí)間不能早于該時(shí)間;unix時(shí)間戳 iat ??【issued at】 該jwt的發(fā)布時(shí)間;unix 時(shí)間戳 jti? ? 【JWT ID】 該jwt的唯一ID編號(hào)
base64UrlEncode(payload)
>> eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息
JWS 的概念
JWS 的結(jié)構(gòu)
RSASSA ||?ECDSA ||?HMACSHA256(
??base64UrlEncode(header) + "."?+
??base64UrlEncode(payload),
??secret)
>>?GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ
>>?# 上面這個(gè)是用 HMAC SHA256生成的eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19.GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQJWS 的額外頭部聲明
jku: 發(fā)送JWK的地址;最好用HTTPS來(lái)傳輸 jwk: 就是之前說(shuō)的JWK kid: jwk的ID編號(hào) x5u: 指向一組X509公共證書(shū)的URL x5c: X509證書(shū)鏈 x5t:X509證書(shū)的SHA-1指紋 x5t#S256: X509證書(shū)的SHA-256指紋 typ: 在原本未加密的JWT的基礎(chǔ)上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后文會(huì)說(shuō)及。適用于JOSE標(biāo)頭的對(duì)象與此JWT混合的情況。 crit: 字符串?dāng)?shù)組,包含聲明的名稱,用作實(shí)現(xiàn)定義的擴(kuò)展,必須由 this->JWT的解析器處理。不常見(jiàn)。
多重驗(yàn)證與JWS序列化
{
????"payload": "eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ",
"signatures":
????[
????????{
????????????"protected": "eyJhbGciOiJSUzI1NiJ9",
????????????"header": { "kid": "2010-12-29"?},
????????????"signature":"signature1"
????????},
????????{
????????????"protected": "eyJhbGciOiJSUzI1NiJ9",
????????????"header": { "kid": "e9bc097a-ce51-4036-9562-d2ade882db0d"?},
????????????"signature":"signature2"
????????},
????????...
????]
}JWE 相關(guān)概念? ?

JWE 的構(gòu)成
eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.
UGhIOguC7IuEvf_NPVaXsGMoLOmwvc1GyqlIKOK1nN94nHPoltGRhWhw7Zx0-kFm1NJn8LE9XShH59_
i8J0PH5ZZyNfGy2xGdULU7sHNF6Gp2vPLgNZ__deLKxGHZ7PcHALUzoOegEI-8E66jX2E4zyJKxYxzZIItRzC5hlRirb6Y5Cl_p-ko3YvkkysZIFNPccxRU7qve1WYPxqbb2Yw8kZqa2rMWI5ng8Otv
zlV7elprCbuPhcCdZ6XDP0_F8rkXds2vE4X-ncOIM8hAYHHi29NX0mcKiRaD0-D-ljQTPcFPgwCp6X-nZZd9OHBv-B3oWh2TbqmScqXMR4gp_A.
AxY8DCtDaGlsbGljb3RoZQ.
KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY.
9hH0vgRfYgPnAHOd8stkvwThe protected header,類(lèi)似于JWS的頭部; The encrypted key,用于加密密文和其他加密數(shù)據(jù)的對(duì)稱密鑰; The initialization vector,初始IV值,有些加密方式需要額外的或者隨機(jī)的數(shù)據(jù); The encrypted data (cipher text),密文數(shù)據(jù); The authentication tag,由算法產(chǎn)生的附加數(shù)據(jù),來(lái)防止密文被篡改。
JWE 密鑰加密算法
Key Encryption Key Wrapping Direct Key Agreement Key Agreement with Key Wrapping Direct Encryption
JWE Header
type:一般是 jwt alg:算法名稱,和JWS相同,該算法用于加密稍后用于加密內(nèi)容的實(shí)際密鑰 enc:算法名稱,用上一步生成的密鑰加密內(nèi)容的算法。 zip:加密前壓縮數(shù)據(jù)的算法。該參數(shù)可選,如果不存在則不執(zhí)行壓縮,通常的值為 DEF,也就是deflate算法 jku/jkw/kid/x5u/x5c/x5t/x5t#S256/typ/cty/crit:和JWS額額外聲明一樣。
JWE 的加密過(guò)程
base64(header) + '.' +
base64(encryptedKey) + '.' + // Steps 2 and 3
base64(initializationVector) + '.' + // Step 4
base64(ciphertext) + '.' + // Step 6
base64(authenticationTag) // Step 6
多重驗(yàn)證與JWE序列化
{
????"protected": "eyJlbmMiOiJBMTI4Q0JDLUhTMjU2In0",
????"unprotected": { "jku":"https://server.example.com/keys.jwks"?},
????"recipients":[
????????{
????????"header": { "alg":"RSA1_5","kid":"2011-04-29"?},
????????"encrypted_key":
????????"UGhIOguC7Iu...cqXMR4gp_A"
????????},
????????{
????????"header": { "alg":"A128KW","kid":"7"?},
????????"encrypted_key": "6KB707dM9YTIgH...9locizkDTHzBC2IlrT1oOQ"
????????}
????],
????"iv": "AxY8DCtDaGlsbGljb3RoZQ",
????"ciphertext": "KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY",
????"tag": "Mz-VPPyU4RlcuYv1IwIvzw"
}protected:之前的頭部聲明,利用b64uri加密; unprotected:一般放JWS的額外聲明,這段內(nèi)容不會(huì)被b64加密; iv:64加密后的iv參數(shù); add:額外認(rèn)證數(shù)據(jù); ciphertext:b64加密后的加密數(shù)據(jù); recipients:b64加密后的認(rèn)證標(biāo)志-加密鏈,這是一個(gè)數(shù)組,每個(gè)數(shù)組中包含了兩個(gè)信息; header:主要是聲明當(dāng)前密鑰的算法; encrypted_key:JWE加密密鑰。
0x04 JWT 的工作原理

Authorization: Bearer
Authorization: Bearer中發(fā)送令牌,則跨域資源共享(CORS)將不會(huì)成為問(wèn)題,因?yàn)樗皇褂胏ookie。
ECDSA|RSASSA or HMAC ?應(yīng)該選用哪個(gè)?
推薦閱讀
面試管:用了HTTPS就安全了嗎?HTTPS 會(huì)被抓包嗎?
MySQL 在并發(fā)場(chǎng)景下會(huì)遇到的問(wèn)題及解決方案~
讀完《Effective Java》: 我整理這 50 條技巧
面試中又被問(wèn)到Redis如何實(shí)現(xiàn)搶購(gòu),趕快代碼實(shí)現(xiàn)一波吧!
最后,推薦給大家一個(gè)有趣有料的公眾號(hào):寫(xiě)代碼的渣渣鵬,7年老程序員教你寫(xiě)bug,回復(fù) 面試或資源 送一你整套開(kāi)發(fā)筆記 有驚喜哦
評(píng)論
圖片
表情

