HMAC-SHA256
是一种通过特别计算方式之后产生的消息认证码使用散列算法同时结合一个加密密钥。它可以用来保证数据的完整性,同时可以用来作某个消息的身份验证
import hmac
key = b''
string = b''
h = hmac.new(key, string, digestmod=hashlib.sha256)
h.digest()
JWT-校验jwt规则
- 确认alg解析header
- 签名校验-根据传过来的header和payload按 alg 指明的算法进行签名,将签名结果和传过来的sign进行对比,若对比一致,则校验通过。
- 获取payload自定义内容
# 安装pyjwt,而不是jwt
pip install pyjwt -i https://pypi.tuna.tsinghua.edu.cn/simple/
JWT的三部分
生成的token由三部分组成,以.
分隔
import jwt
import time
import base64
def make_token(username, expire=3600 * 24):
key = '123456'
now_t = time.time()
payload_data = {
'username': username,
'exp': now_t + expire
}
return jwt.encode(payload_data, key, algorithm='HS256')
def unmake_token(token):
key = '123456'
return jwt.decode(token, key, algorithms=['HS256'])
token = make_token('poppy')
print(f'token:{token},{type(token)}')
# 第一部分,头信息,注明使用的算法、类型等信息,采用base64生成
headers = token.split('.')[0]
headers = base64.b64decode(headers).decode('utf-8')
print(f'headers:{headers},{type(headers)}')
# 第二部分,payload,需要加密的信息,通常包括用户信息等,采用base64生成
payload = token.split('.')[1]
payload = base64.b64decode(payload).decode('utf-8')
print(f'payload:{payload},{type(payload)}')
# 第三部分是对第一、二部分经过加密后得到的
# --------------------------------------------
# 如果第三部分经过解密以后与第一、二部分符合,则token有效,返回加密的内容
ori_string = unmake_token(token)
print(f'ori_string:{ori_string},{type(ori_string)}')
token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InBvcHB5IiwiZXhwIjoxNzA2NTkyNDA3LjgzNTA3NjZ9.GwJa7CLxE1N7-S7COWCgut4AHE_NTTM9rS4XvRqPVDk,<class 'str'>
headers:{"alg":"HS256","typ":"JWT"},<class 'str'>
payload:{"username":"poppy","exp":1706592407.8350766},<class 'str'>
ori_string:{'username': 'poppy', 'exp': 1706592407.8350766},<class 'dict'>