jwt-cracker 教學:暴力破解 JWT HS256 Secret 的原理、實作與防禦
JWT(JSON Web Token)是現代 Web API 最常見的身分驗證方式之一。當 JWT 使用 HS256 這類對稱式演算法簽章,而開發者又設定了太短或太簡單的 Secret,攻擊者只要拿到一組 Token,就能離線暴力破解出 Secret,進而偽造任意身分的 Token。這篇用 jwt-cracker 示範整個破解流程,最後整理防禦方式。
注意:本文僅供資安教育與授權測試使用,請勿對未經授權的系統進行測試。
JWT 的結構
一個 JWT 由三段 Base64URL 編碼字串組成,以 . 分隔:
- Header:簽章演算法與型別,例如
{"alg":"HS256","typ":"JWT"} - Payload:使用者資訊等聲明(claims),例如
sub、name、iat - Signature:用 Secret 對前兩段計算出的 HMAC 簽章
Header 和 Payload 只是編碼、不是加密,任何人都能解開來看。真正保護 Token 不被竄改的,只有 Signature 和背後的 Secret。
jwt-cracker 破解原理與實作
回想一下,JWT HS256 是使用Secret計算的。計算的確切格式是
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
因此,有理由認為,由於我們擁有完整的 jwt token,以及標頭和有效載荷,因此可以通過暴力破解來獲取完整的 JWT 令牌。如果這個secret可以被暴力破解,那麼攻擊者就可以簽署他自己的 JWT token。
為了暴力破解這些秘密,我們將使用一個名為jwt-cracker的工具。jwt-cracker 的語法是jwt-cracker <token> [alphabet] [max-length]字母表和最大長度是可選參數。
參數說明:
| Token | The HS256 JWT token |
| Alphabet | 破解者用於檢查密碼的字母表(默認:“abcdefghijklmnopqrstuvwxyz”) |
| max-length | 秘密的最大預期長度(默認為 12) |
安裝
npm install --global jwt-cracker
練習
試著破解這個JWT token吧!
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.it4Lj1WEPkrhRo9a2-XHMGtYburgHbdS5s7Iuc1YKOE
利用這套工具,我們只用20秒就破且取得secret了。

用 hashcat 加速破解
jwt-cracker 是單純的暴力列舉,適合教學與短 Secret。實務上若要用字典檔或 GPU 加速,可以改用 hashcat 的 JWT 模式(16500):
hashcat -a 0 -m 16500 jwt.txt wordlist.txt
jwt.txt 放入完整的 JWT Token,wordlist.txt 是字典檔(例如 rockyou.txt)。很多真實案例的 Secret 就是 secret、changeme 或專案名稱,字典攻擊幾秒內就能命中。
如何防禦 JWT Secret 被暴力破解?
- 使用夠長的隨機 Secret:HS256 建議至少 256 位元(32 bytes)的隨機值,例如
openssl rand -base64 32,不要用單字或專案名稱 - 改用非對稱演算法:RS256 / ES256 以私鑰簽章、公鑰驗證,就算拿到 Token 也無法反推私鑰
- 固定允許的演算法:伺服器端驗證時寫死允許的
alg,避免alg: none或演算法混淆攻擊 - 設定短效期並定期輪替金鑰:搭配
exp與 Refresh Token 機制,降低外洩後的影響 - Secret 不要寫在程式碼裡:放在環境變數或金鑰管理服務,避免隨原始碼外洩
常見問題
JWT 被破解後會發生什麼事?
攻擊者可以自行修改 Payload(例如把 role 改成 admin),再用破解出的 Secret 重新簽章,伺服器會當成合法的 Token 接受,等於取得任意使用者的權限。
只想解碼看看 JWT 內容,有線上工具嗎?
SecTools 資安工具箱裡有 JWT 解碼工具,運算都在瀏覽器本機完成,Token 不會被送到伺服器。
