jwt

jwt

Json Web Token简称jwt,其实感觉和flask session很像https://kit4y.github.io/2019/11/19/flask-zhong-session-de-na-xie-shi/
JWT一般的为三部分:header,payload,Signature
而flask-session的三部分为json->zlib->base64后的源字符串 . 时间戳 . hmac签名信息

jwt组成

通常由两部分组成:令牌的类型,即JWT和正在使用的散列算法,如HMAC SHA256或RSA。

1
2
3
4
{
"alg":"RS256",
"typ":"JWT"
}

alg为算法的缩写,typ为类型的缩写

然后,这个JSON被Base64编码,形成JSON Web Token的第一部分。

Payload

令牌的第二部分是包含声明的有效负载。声明是关于实体(通常是用户)和其他元数据的声明。

这里是用户随意定义的数据

例如上面的举例

1
2
3
4
{
"name":"adminsky",
"priv":"other"
}

然后将有效载荷Base64进行编码以形成JSON Web Token的第二部分。

但是需要注意对于已签名的令牌,此信息尽管受到篡改保护,但任何人都可以阅读。除非加密,否则不要将秘密信息放在JWT的有效内容或标题元素中。

Signature

要创建签名部分,必须采用header,payload,密钥

然后利用header中指定算法进行签名

例如HS256(HMAC SHA256),签名的构成为

1
2
3
4
HMACSHA256(
base64Encode(header) + "." +
base64Encode(payload),
secret)

然后将这部分base64编码形成JSON Web Token第三部分  

这里采用的是私钥签名,公钥验证的方法。

在线工具

https://jwt.io/
http://jwt.calebb.net/

jwt密钥爆破工具

https://github.com/brendan-rius/c-jwt-cracker
使用方法

1
2
3
4
git clone https://github.com/brendan-rius/c-jwt-cracker
cd c-jwt-cracker
make
./c-jwt-cracker

python3对jwt操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# -*- coding: utf-8 -*-

import jwt

data = {
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
# 加密 py3加密后是字节型数据
encoded = jwt.encode(data, 'secret', algorithm='HS256')
print(encoded.decode())
# eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
# eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
# 7m6JhjDj0Blnye6rLAat5mX0BCivb9XXuEY15LprW8c


print(jwt.decode(encoded, 'secret', algorithms=['HS256']))
# {'sub': '1234567890', 'name': 'John Doe', 'iat': 1516239022}