前言:某app的商品库存一直为0,不定期补货,这样天天盯着库存谁受得了啊,准备使用python脚本自动获取库存
通过charles抓包,最终锁定认证接口/sdkcs/verify,返回信息如下
{
"status": 0,
"message": "success",
"ak": "6QT6xWMiHSbhruH859IN85F2MPhzZhon",
"token": "1943GezNCn1cEevLK068Ap3r+X7djdsNLi5PNRHrSbNmKy2fdlXDXOyQH4FzVDRt4noIURN8QhvbPynMjzK63H56FCct1Xk7U6f1fnKECxfV",
"uid": "2999470476",
"sk": "UrITaTZuA8k4Iw8hL3LALPjS2AkYa8r4",
"user_permission": 0,
"ak_permission": 0
}
但是请求接口请求头authoriztion,使用的是jwt认证,格式如下
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxODI3NjEiLCJhdWQiOiJXRUlYSU4iLCJleHAiOjE1ODc1NjgxODAsImlhdCI6MTU4NzU2MDk4MCwianRpIjoiMWQzMDhhOWEtNzg0ZC00NzVjLWE5ZDEtOGZiZmYxMTk1MDY0In0.F4G-NpKcqQ5AuZyK1R7LTPi5zX0AW3hOalODvoeny5Q
JWT有三个部分如下,以点号分割。分别为JWT头、有效载荷和签名拿到jwt.io这个在线解密网站解密一下
第一部分:jwteyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9为jwt的头,base64解码为:
{
"alg": "HS256",
"typ": "JWT"
}
alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256);typ属性表示令牌的类型,JWT令牌统一写为JWT。
第二部分:有效载荷
eyJzdWIiOiIxODI3NjEiLCJhdWQiOiJXRUlYSU4iLCJleHAiOjE1ODc1NjgxODAsImlhdCI6MTU4NzU2MDk4MCwianRpIjoiMWQzMDhhOWEtNzg0ZC00NzVjLWE5ZDEtOGZiZmYxMTk1MDY0In0
base64解密为:
{ "sub": "182761",
"aud": "WEIXIN",
"exp": 1587568180,
"iat": 1587560980,
"jti": "1d308a9a-784d-475c-a9d1-8fbff1195064"
}
sub:用户唯一id
aud:客户端类型
exp:过期时间
iat:签发jwt时间
jti:每一次jwt的签发的唯一ID
过期时间和签发时间相减刚好两小时
第三部分:签名
F4G-NpKcqQ5AuZyK1R7LTPi5zX0AW3hOalODvoeny5Q
这就是最重要的部分,因为jwt的签发是从服务器签发给客户端的。通过一个密钥生成的,在任何场景都不应该流露出去。一旦客户端得知这个密钥, 那就意味着客户端是可以自我签发jwt了,最终就是要找到这个密钥,但是这个密钥还无法破解,暴力破解只能破解弱密码,对于强密码不可行。