JWT--json web token

加密算法

1.base64

方法 作用 参数 返回值
b64encode(s) 将类字节串的数据编码成base6串的数据 s:要编码的参数, bytes类型 符合base64规的字节串数据
base64.b64decode(s) 解码给定的base64串。 s: 要解码的数据,bytes类 解码后的字节串数据
urlsafe_b64encode(s) 作用同b64encode,但是会将 ‘+‘替换成 ‘-’,将’/‘替换成’_’
urlsafe_b64decode(s)
import base64
bs64 = base64.b64encode('测试编码'.encode()) # b'5rWL6K+V57yW56CB'
print(bs64)
bs64_decode = base64.b64decode(bs64).decode()
print(bs64_decode) # 测试编码

2,SHA-256

import hashlib
s = hashlib.sha256() #创建sha256对象
s.update(b'xxxx')  #添加欲hash的内容,类型为 bytes
s.digest()  #获取最终结果

3,HMAC-SHA256

是一种通过特别计算方式之后产生的消息认证码,使用散列算法同时结合一个加密密钥。它可以用来保证数据的完整性,同时可以用来作某个消息的身份验证.

import hmac
#生成hmac对象
#第一个参数为加密的key,bytes类型,
#第二个参数为欲加密的串,bytes类型
#第三个参数为hmac的算法,指定为SHA256
h = hmac.new(key, str, digestmod='HS256 ') 
h.digest() #获取最终结果

JWT - json-web-token

三大组成

  1. header

    {'alg':'HS256', 'typ':'JWT'}
    #alg代表要使用的 算法
    #typ表明该token的类别 - 此处必须为 大写的 JWT
    
  2. payload

    字典格式: 公有声明 + 私有声明

    公有声明: JWT提供了内置关键字用于描述常见的问题,可选的,用户可根据需要按需添加key

    常用声明如下:

    {'exp':xxx, # Expiration Time 此token的过期时间的时间戳, time.time() + 有效期(单位s)
     'iss':xxx,# (Issuer) Claim 指明此token的签发者
     'iat':xxx, # (Issued At) Claim 指明此创建时间的时间戳
     'aud':xxx, # (Audience) Claim	指明此token签发面向群体
    }
    

    私有声明:用户根据自己的业务需要可以添加自定义key

    {"username": "sf.zhang"}
    
  3. signature 签名

    规则如下:

    根据header中的alg确定具体算法,以下以HS256为例.

    import hmac
    h = hmac.new(key, b64encode(json.dumps(header))+ b'.' + b64encode(json.dumps(payload)), digestmod='SHA256 ') 
    token = bs64encode(h.digest())
    
  4. 最终结果

    jwt = b64encode(header) + b"." + b64encode(payload) + b"." + token 
    
  5. 一个具体的例子

    import base64
    import hmac
    import time
    import json
    class JWT:
        @staticmethod
        def b64_obj(dict_obj):
            str_json = json.dumps(dict_obj,sort_keys=True,separators=(',',':'))
            return base64.urlsafe_b64encode(str_json.encode('utf8'))
        @staticmethod
        def encode(key, payload,exp=5*60, header={'alg':'HS256', 'typ':'JWT'}):
            bs_header = JWT.b64_obj(header)
            _payload = dict(payload)
            _payload['exp'] = time.time() + exp
            bs_payload = JWT.b64_obj(_payload)
            
            h = hmac.new(key, bs_header + b'.' + bs_payload, digestmod='SHA256')
            bs_sign = base64.urlsafe_b64encode(h.digest())
            return bs_header + b'.' +  bs_payload + b'.' + bs_sign
        
        @staticmethod
        def decode(key, token):
            header, payload, sign = token.split(b'.')
            h = hmac.new(key, header + b'.' + payload, digestmod='SHA256')
            sign1 = base64.urlsafe_b64encode(h.digest())
            if sign1 != sign:
                raise Exception('sign error!')
            str_payload = base64.urlsafe_b64decode(payload)
            # 检查过期时间 ...
            return json.loads(str_payload)
        
    
    token = JWT.encode(b'123456', {'username': 'luan'})
    
    d = JWT.decode(b'123456', token)
    

    自定义token中,header部分用不到,可以把它去掉

    pyjwt

    1. 安装 pip3 install pyjwt

    2. 方法说明

      方法 参数说明 返回值
      encode(payload, key, algorithm) payload: jwt三大组成中的payload,需要组成字典,按需添加公有声明和私有声明
      例如: {‘username’: ‘sf.zhang’, ‘exp’: 1562475112}
      参数类型: dict
      token串
      返回类型:bytes
      key : 自定义的加密key
      参数类型:str
      algorithm: 需要使用的加密算法[HS256, RSA256等]
      参数类型:str
      decode(token,key,algorithm,) token: token串
      参数类型: bytes/str
      payload明文
      返回类型:dict
      key : 自定义的加密key ,需要跟encode中的key保持一致
      参数类型:str
      algorithm: 同encode
      issuer: 发布者,若encode payload中添加 ‘iss’ 字段,则可针对该字段校验
      参数类型:str
      若iss校验失败,则抛出jwt.InvalidIssuerError
      audience:签发的受众群体,若encode payload中添加’aud’字段,则可针对该字段校验
      参数类型:str
      若aud校验失败,则抛出jwt.InvalidAudienceError

你可能感兴趣的:(django)