JSON Web Token就是JWT的全名,用途比较广泛的验证信息的方式。
JWT由三部分构成,分别是头部(header),载荷(payload),和签名(signature)。三部分由两个.
分隔。
签名(signature)是由头部(header),和载荷(payload)经过加密算法和秘钥加密得出,秘钥不泄露的情况下能判断出数据是否被修改。
用到的Python模块 json
, base64
, hmac
, hashlib
先设置头部信息
头部信息包括两部分内容
1、声明类型,这里是jwt
2、声明加密的算法 通常直接使用 HMAC SHA256
header = { 'typ': 'JWT', 'alg': 'HS256' }
将字典类型的头部使用JSON模块转成JSON字符串类型,并且编码成字节类型文件,再用base64编码,然后解码后得到字符串就是token的第一部分
header = base64.b64encode(json.dumps(header).encode()).decode()
载荷部分,存用户的相关信息,不要存敏感信息,这和头部的内容都可被解码看到
payload = { 'user_id': 1, 'username': 'happy' }
和头部的过程一样生成token的第二部分
payload = base64.b64encode(json.dumps(header).encode()).decode()
利用hmac提供的new方法生成一个对象,得到加密后的签名,先导包,然后help(hmac.new)
就可以查看hmac的函数说明。
第一个参数就是秘钥的字节类型,就是一个字符串然后转成字节类型
secret = 'suibianxie'
第二个参数就是头部和载荷拼起来后转成字节类型
message = header + '.' + payload
第三个就是加密的算法了,常用sha256算法
h_obj = hmac.new(secret.encode(), message.encode(), hashlib.sha256)
signature=h_obj.hexdigest()
token=message+'.'+signature
假设接收到传过来的token
首先是将token拆分成两个部分
message, old_signature = token.rsplit('.', maxsplit=1)
利用签发token时用的秘钥,将接收到的token的头部和载荷生成新的签名new_signature,和接受的的token的第三部分old_signature进行比对,若一致,则表示信息没有被需改。
h_obj = hmac.new(secret.encode(), message.encode(), hashlib.sha256)
new_signature = h_obj.hexdigest()
new_signature = h_obj.hexdigest()
这些只是简单的生成和验证token,想要理解更加透彻和用的更加熟练,那就需要自己好好去琢磨。