基于JWT的token弱密鑰爆破

JSON Web Token(JWT)是目前最流行的跨域身份驗(yàn)證解決方案蒿涎。直接根據(jù)token取出保存的用戶信息蜕便,以及對(duì)token可用性校驗(yàn)签赃,大大簡(jiǎn)化單點(diǎn)登錄溃斋。

JWT=header+payload+signature(以.相隔)

例:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NzYxMTk2NTYsInVzZXJuYW1lIjoiemRqIiwicGFzc3dvcmQiOiIxMjMifQ.ud_qtIYt3QywJkmjPZIXVPaW3SnWCFj9dLVYa7iTEIg

下面詳細(xì)介紹一下每個(gè)部分界拦。

頭部(Header)

用于描述關(guān)于該JWT的最基本的信息,例如其類型以及簽名所用的算法等盐类。

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

BASE64編碼后為:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

載荷(playload)

(1)標(biāo)準(zhǔn)中注冊(cè)的聲明(建議但不強(qiáng)制使用)

(2)公共的聲明

(3)私有的聲明(過(guò)期時(shí)間寞奸,用戶名等信息)

{"exp":1576119656,"username":"zdj","password":"123"}

BASE64編碼后:eyJleHAiOjE1NzYxMTk2NTYsInVzZXJuYW1lIjoiemRqIiwicGFzc3dvcmQiOiIxMjMifQ

簽名(signature)

header(base64)+payload(base64)使用.連接組成的字符串,然后通過(guò)header中聲明的加密方式進(jìn)行加鹽secret組合加密在跳,然后就構(gòu)成了jwt的第三部分

ud_qtIYt3QywJkmjPZIXVPaW3SnWCFj9dLVYa7iTEIg

注:secret是保存在服務(wù)器端的簽名私鑰,就是我們今天的主角隐岛;

基于java實(shí)現(xiàn)JWT:

生成token:

public static String Generatetoken(String username, String password) {

String token = "";

try {

// 過(guò)期時(shí)間

Date date = new Date(System.currentTimeMillis() + EXPIRE_DATE);

// 秘鑰及加密算法

Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);

// 設(shè)置頭部信息

Map<String, Object> header = new HashMap<String, Object>();

header.put("typ", "JWT");

header.put("alg", "HS256");

// 攜帶username猫妙,password信息,生成簽名

token = JWT.create().withHeader(header)

.withClaim("username", username)

.withClaim("password", password).withExpiresAt(date)

.sign(algorithm);

} catch (Exception e) {

e.printStackTrace();

return null;

}

return token;

}

校驗(yàn)token:

public static boolean verify(String token) {

try {

Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);

JWTVerifier verifier = JWT.require(algorithm).build();

System.out.println("驗(yàn)證token:" + token);

DecodedJWT jwt = verifier.verify(token);

return true;

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

生成的token為

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NzYxMTk2NTYsInVzZXJuYW1lIjoiemRqIiwicGFzc3dvcmQiOiIxMjMifQ.ud_qtIYt3QywJkmjPZIXVPaW3SnWCFj9dLVYa7iTEIg

綜上聚凹,我們要偽造token割坠,首先要拿到TOKEN_SECRET,才可以偽造簽名妒牙,token才能校驗(yàn)通過(guò)彼哼。

pyjwt 庫(kù),可通過(guò) jwt.decode(jwt_str, verify=True, key=key_)

進(jìn)行簽名校驗(yàn)湘今,但導(dǎo)致校驗(yàn)失敗的因素不僅密鑰錯(cuò)誤敢朱,還可能是數(shù)據(jù)部分中預(yù)定義字段錯(cuò)誤(如,當(dāng)前時(shí)間超過(guò) exp),也可能是 JWT字符串格式錯(cuò)誤等等拴签,所以孝常,借助 jwt.decode(jwt_str, verify=True, key=key_) 驗(yàn)證密鑰 key_:

1.若簽名直接校驗(yàn)失敗,則 key_ 為有效密鑰蚓哩;

2.若因數(shù)據(jù)部分預(yù)定義字段錯(cuò)誤

(jwt.exceptions.ExpiredSignatureError,

jwt.exceptions.InvalidAudienceError,

jwt.exceptions.InvalidIssuedAtError,

jwt.exceptions.InvalidIssuedAtError,

jwt.exceptions.ImmatureSignatureError)導(dǎo)致校驗(yàn)失敗构灸,說(shuō)明并非密鑰錯(cuò)誤導(dǎo)致,則 key_ 也為有效密鑰岸梨;

3.若因密鑰錯(cuò)誤(jwt.exceptions.InvalidSignatureError)導(dǎo)致校驗(yàn)失敗喜颁,則 key_ 為無(wú)效密鑰;

4.若為其他原因(如曹阔,JWT 字符串格式錯(cuò)誤)導(dǎo)致校驗(yàn)失敗洛巢,根本無(wú)法驗(yàn)證當(dāng)前 key_ 是否有效。

按此邏輯次兆,快速實(shí)現(xiàn) JWT 密鑰暴破功能稿茉,代碼如下:

爆破弱密鑰腳本

準(zhǔn)備好key.txt字典,目標(biāo)token為:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NzYxMjE1NDcsInVzZXJuYW1lIjoiemRqIiwicGFzc3dvcmQiOiIxMjMifQ.mkCLR5Kje9x-z8hRgWBMxnQm8hknOwV1Zd8uSZa3rQY芥炭,運(yùn)行腳本進(jìn)行爆破:

無(wú)法獲取到key
獲取到key

總結(jié)

因此漓库,開發(fā)員要十分注意token的密鑰強(qiáng)度,不然攻擊者可以通過(guò)pyjwt爆破得到token密鑰园蝠,通過(guò)header和payload進(jìn)行signature渺蒿,進(jìn)而偽造token發(fā)生跨域攻擊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末彪薛,一起剝皮案震驚了整個(gè)濱河市茂装,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌善延,老刑警劉巖少态,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異易遣,居然都是意外死亡彼妻,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門豆茫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)侨歉,“玉大人,你說(shuō)我怎么就攤上這事揩魂∮牡耍” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵火脉,是天一觀的道長(zhǎng)牵舵。 經(jīng)常有香客問(wèn)我柒啤,道長(zhǎng),這世上最難降的妖魔是什么棋枕? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任白修,我火速辦了婚禮,結(jié)果婚禮上重斑,老公的妹妹穿的比我還像新娘兵睛。我一直安慰自己,他們只是感情好窥浪,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布祖很。 她就那樣靜靜地躺著,像睡著了一般漾脂。 火紅的嫁衣襯著肌膚如雪假颇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天骨稿,我揣著相機(jī)與錄音笨鸡,去河邊找鬼。 笑死坦冠,一個(gè)胖子當(dāng)著我的面吹牛形耗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辙浑,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼激涤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了判呕?” 一聲冷哼從身側(cè)響起倦踢,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎侠草,沒想到半個(gè)月后辱挥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梦抢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年般贼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奥吩。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蕊梧,靈堂內(nèi)的尸體忽然破棺而出霞赫,到底是詐尸還是另有隱情,我是刑警寧澤肥矢,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布端衰,位于F島的核電站叠洗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏旅东。R本人自食惡果不足惜灭抑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抵代。 院中可真熱鬧腾节,春花似錦、人聲如沸荤牍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)康吵。三九已至劈榨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晦嵌,已是汗流浹背同辣。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惭载,地道東北人旱函。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像棕兼,于是被迫代替她去往敵國(guó)和親陡舅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344