JWT密钥破解
工具
编译
root@kali:~/桌面/c-jwt-cracker-master/c-jwt-cracker-master# make
使用
root@kali:~/桌面/c-jwt-cracker-master/c-jwt-cracker-master# /root/桌面/c-jwt-cracker-master/c-jwt-cracker-master/jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiaGludCI6IlRoZSBTaWduYXR1cmUncyBNZDUgaXMgWmlwJ3MgUGFzc3dvcmQiLCJpYXQiOjE1MTYyMzkwMjJ9.wvVICsoUEmVkDxWAfBgDR9Xp32x88OB1h08UmTTenxA Secret is "Zac1"
关于JWT
JWT的组成
我们随便来看一个:
1
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJoZWxsbyIsImlhdCI6MTU2MjUwNDkxOCwiZXhwIjoxNTYyNTA0OTIzLCJhY2NvdW50Ijoia2sifQ.GqWnsUjzpqtE4GJrZ5Zim_nrwnQTGAlidoGqe3354yM
JWT的格式非常简单
JWT的数据分为三个部分: headers
, payloads
,signature(签名)
三者通过.
分割,均采用base64编码
Headers
1
2
3
4
5
6
7eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
解码后为:
{
"typ": "JWT",
"alg": "HS256"
}
alg为算法的缩写,typ为类型的缩写,有时候还会有kid,kid表示算法所使用的密钥文件(当服务端需要多个密钥文件时使用)
Payloads
1
2
3
4
5
6
7
8
9eyJpc3MiOiJoZWxsbyIsImlhdCI6MTU2MjUwNDkxOCwiZXhwIjoxNTYyNTA0OTIzLCJhY2NvdW50Ijoia2sifQ
解码后为:
{
"iss": "hello",
"iat": 1562504918,
"exp": 1562504923,
"account": "kk"
}
这几个字段的含义如下,其中需要注意的字段是exp,这字段可在一定程度上被用来防止重放攻击
iss(issuer):发布者的url地址
sub(subject):该JWT所面向的用户,用于处理特定应用,不是常用的字段
aud(audience):接受者的url地址
exp(expiration):该jwt销毁的时间;unix时间戳
nbf(not before):该jwt的使用时间不能早于该时间;unix时间戳
iat(issued at):该jwt的发布时间;unix 时间戳
jti(JWT ID):该jwt的唯一ID编号
Signature
1
GqWnsUjzpqtE4GJrZ5Zim_nrwnQTGAlidoGqe3354yM
因为header和payload是明文存储的,所以签名是为了防止数据被修改的,提供了对数据的交易功能
签名常使用RS256(RSA 非对称加密,使用私钥签名)、HS256(HMAC SHA256 对称加密)算法,签名对象为base64encode(headers) + ‘.’ + base64encode(payloads)