打造你的JWT(json web tokens)

JWT是用作兩個(gè)服務(wù)之間傳遞聲明的簡潔結(jié)構(gòu)小压。他們通常是json對(duì)象弄息,并且可以用于加密(或不加密)消息認(rèn)證碼(MAC)猬膨,通過簽名的方式來保護(hù)底層信息的完整性。JWT結(jié)構(gòu)來源自RFC7519標(biāo)準(zhǔn)答毫。 一個(gè)JSON Web Token(JWT)包含3個(gè)部分: encoded Header(編碼頭)褥民,encoded Payload(編碼信息主體),Signature(簽名) 洗搂。

一個(gè)jwt的構(gòu)成結(jié)構(gòu)

header包含的信息消返,定義了token令牌的類型,還有payload的加密算法耘拇。
payload包含了路由和服務(wù)的claim 鍵值對(duì)撵颊,這里可以存放大量的信息。一個(gè)claim 通常定義了最終用戶的身份或者一些額外的信息惫叛,這取決于claim 的類型倡勇。例如:

Reserved Claims: 一些前置定義和一些有用的互動(dòng)信息。比如issuer (發(fā)行主體), sub (提供者), expiration time (過期時(shí)間), audience (接收者) 還有其他的信息嘉涌。

Public Claims: 在 IANA JSON Web Token Registry公開使用的或者作為URI妻熊。

Private Claims:由雙方定義并分享的一些Claims。

最后仑最,signature 是header和payload由BASE64編碼后通過密鑰加密計(jì)算生成的扔役。(關(guān)于Claims的詳細(xì)介紹見http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#rfc.section.4

盡管Jwt支持對(duì)稱和非對(duì)稱的加密方式,但我們將針對(duì)對(duì)稱加密HMAC SHA 256[HS256]這些加密方式展開討論词身,因?yàn)橄旅娴膯栴}會(huì)使用到它厅目。
這是在一個(gè)請(qǐng)求中有效的JWT例子番枚。下面的右圖表示JWT包含的3個(gè)部分法严,Header, Payload,還有計(jì)算生成的Signature葫笼。生成的token是由編碼后的header,payload,signature組合而成的深啤,如左圖。


一個(gè)有效的JWT
認(rèn)證

JWT或許是應(yīng)用中最常用的身份認(rèn)證方式路星。認(rèn)證成功之后溯街,應(yīng)用給用戶頒發(fā)認(rèn)證token诱桂,它將成為用戶獲取所有服務(wù)資源的憑據(jù)。理論上呈昔,這個(gè)token需要被密鑰保護(hù)挥等。

分析

在這篇博客中,我們討論這樣一個(gè)案例堤尾,該案例使用了JWT的不良實(shí)現(xiàn)來作用戶的認(rèn)證和授權(quán)肝劲。
分析初始請(qǐng)求時(shí),我們可以確認(rèn)網(wǎng)站正在使用jwt做身份認(rèn)證郭宝。

服務(wù)使用JWT做用戶認(rèn)證

接下來辞槐,在返回中,我們可以找到包含用戶配置信息的編碼token粘室,如下圖:
登陸成功后網(wǎng)站返回了授權(quán)碼

登陸成功后榄檬,我們可以訪問任務(wù),文檔管理還有一些普通用戶的其他的功能衔统,如下圖
網(wǎng)站的功能頁面

到這里鹿榜,我們回想一下,分析我們收到的這個(gè)認(rèn)證token锦爵。我們使用https://jwt.io/提供的功能來驗(yàn)證不同密鑰的signature 犬缨。當(dāng)然,在大多數(shù)情況下我們使用這個(gè)方法無法得到有效的signature 棉浸。
非法簽名

在此關(guān)鍵時(shí)刻怀薛,我們無法組合一個(gè)有效的signature來幫助我們修改payload和生成一個(gè)有效的正確token。我們?nèi)笔籎WTS簽名的
‘secret key’迷郑。我們寫一個(gè)簡單的python腳本從一串可猜測的隨機(jī)的字符串(存在本地文件secret.txt中)來暴力破解‘secret key’枝恋,如下圖:

python腳本

我們最終成功的暴力得到了用于JWT簽名的正確密鑰,如下


image015-1024x272.png

為了確認(rèn)這確實(shí)是個(gè)正確的token嗡害,我們檢驗(yàn)不修改payload和header生成的signature 與先前的signature 是否一致(筆者注:填寫暴力破解的secret key焚碌,檢查產(chǎn)生的signature 與先前的signature )


檢驗(yàn)成功

現(xiàn)在我們得到了正確的密鑰,我們寫一個(gè)新的token,在角色屬性中增加“admin”來發(fā)起一次新的請(qǐng)求霸妹。下圖展示的是修改了角色的JWT請(qǐng)求的頁面十电,新的token是用了上一步獲得的密鑰簽名得到的。
修改角色

在服務(wù)端接收的Authorization header頭中叹螟,我們使用了上一步創(chuàng)建的token鹃骂。上一次我們的用戶是site visitor(訪問者),現(xiàn)在我們得到了更高的(管理者)權(quán)限罢绽。下圖展示的是我們用自己創(chuàng)造的token傳遞給服務(wù)器畏线。
使用該token訪問網(wǎng)站

提升了權(quán)限看到的頁面

此外,我們還訪問了管理員功能良价,比如用服務(wù)提供的token來管理用戶寝殴。


管理用戶

有意思的是蒿叠,對(duì)于上面提到的系統(tǒng),可以通過修改持有token的jwt的payload來模擬用戶蚣常。
結(jié)論

服務(wù)使用JWT來保護(hù)它的資源是欠妥當(dāng)?shù)氖醒省J褂貌粔虬踩模軌虮┝ζ平獾拿荑€來對(duì)JWTs簽名會(huì)造成不好的結(jié)果抵蚊。在上面的情形中魂务,只要密鑰被得到,心存不良的人可以提升它的權(quán)限來訪問服務(wù)的管理功能泌射。這對(duì)水平和垂直的權(quán)限提升同樣有效粘姜,或者簡單的枚舉用戶的IDs來模擬其他用戶。
給敏感的數(shù)據(jù)配置強(qiáng)度高的值熔酷,比如密碼和密鑰孤紧,對(duì)于保護(hù)服務(wù)和它的用戶遭到攻擊大有裨益。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拒秘,一起剝皮案震驚了整個(gè)濱河市号显,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌躺酒,老刑警劉巖押蚤,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異羹应,居然都是意外死亡揽碘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門园匹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雳刺,“玉大人,你說我怎么就攤上這事裸违∫磋耄” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵供汛,是天一觀的道長枪汪。 經(jīng)常有香客問我,道長怔昨,這世上最難降的妖魔是什么雀久? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮朱监,結(jié)果婚禮上岸啡,老公的妹妹穿的比我還像新娘。我一直安慰自己赫编,他們只是感情好巡蘸,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著擂送,像睡著了一般悦荒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘹吨,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天搬味,我揣著相機(jī)與錄音,去河邊找鬼蟀拷。 笑死碰纬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的问芬。 我是一名探鬼主播悦析,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼此衅!你這毒婦竟也來了强戴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤挡鞍,失蹤者是張志新(化名)和其女友劉穎骑歹,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墨微,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡道媚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了翘县。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衰琐。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖炼蹦,靈堂內(nèi)的尸體忽然破棺而出羡宙,到底是詐尸還是另有隱情,我是刑警寧澤掐隐,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布狗热,位于F島的核電站,受9級(jí)特大地震影響虑省,放射性物質(zhì)發(fā)生泄漏匿刮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一探颈、第九天 我趴在偏房一處隱蔽的房頂上張望熟丸。 院中可真熱鬧,春花似錦伪节、人聲如沸光羞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纱兑。三九已至呀闻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間潜慎,已是汗流浹背捡多。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铐炫,地道東北人垒手。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像倒信,于是被迫代替她去往敵國和親科贬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348