2020.5.19 token生成

发布于 2020-05-19  54 次阅读


Table of Contents

​ * 在头里面添加内容,协商来操作

  • csrf问题

    • token在登录后,cookie中就已经存在
  • SPA网站是否会影响SEO

    • 会影响SEO
    • Single Page web Application SPA
    • Search Engine Optimization SEO
  • token 令牌

    • JWT - json web token

    • JWT组成

    • 特征 一串字符串 有很多 “.” base64组成
    • 头部 元数据格式
      • {‘alg’:’HS256’,’typ’:’JWT’}
      • alg 算法-默认为HS256
        • typ -默认JWT
    • payload {‘exp’:xxx,’iss:’xxx}

      • 载荷就是存放有效信息的地方。基本上填2种类型数据
    • 标准中注册的声明的数据
      • 自定义数据
      • 由这2部分内部做base64加密。最张数据进入JWT的chaims里存放
      • 公共声明
      • exp:Expiration Time 过期时间 可选
      • nbf:(not Before Time) 生效时间 可选(不常用)
      • iss:issuer Claim 签发者 可选
    • aud:Audience Claim 签发面向群体(Android,IOS) 可选
      • iat:Issued At Claim 创建时间 可选
      • 私有声明
        • 用户可根据业务添加自己的表示
        • 放到payload字典里
    • 整体内容Base64加密
    • sign

      • 要加密的串
    • 使用
      • import base64
        import copy
        import hmac
        import time
        import json
        """
        1.alg中是HS256
        2.hmac.new中digestmod = "SHA256“
        3.注意检测后hmac中的key为字节串
        4.exp的时间要在现有时间上做加法
        """
        class JWT:
        @staticmethod
        def encode(payload, key, exp=300):
        header_b = JWT.b64encode(json.dumps({'alg': "HS256", 'typ': "JWT"}, separators=(",", ":")).encode())
        # print(header_b)
        payload = copy.deepcopy(payload)
        payload['exp'] = time.time() + exp
        payload_b = JWT.b64encode(json.dumps(payload).encode())
        if isinstance(key, str):
        key = key.encode()
        sign = hmac.new(key, header_b + b'.' + payload_b, digestmod="SHA256")
        sign_b = JWT.b64encode(sign.digest())
        # print(header_b + b'.' + payload_b + b'.' + sign_b)
        return header_b + b'.' + payload_b + b'.' + sign_b
        @staticmethod
        def decode(token, key):
        header, payload, sign = token.split(b".")
        now = time.time()
        # print(JWT.b64decode(payload))
        if isinstance(key, str):
        key = key.encode()
        sign = JWT.b64decode(sign)
        new_sign = hmac.new(key, header + b'.' + payload, digestmod="SHA256").digest()
        if sign != new_sign:
        raise ValueError("token error")
        exp = json.loads(JWT.b64decode(payload))['exp']
        # print(exp)
        if now > exp:
        raise ValueError("时间错误")
        return json.loads(JWT.b64decode(payload))
        @staticmethod
        def b64decode(bs):
        bs += b"=" * (4 - len(bs) % 4)
        bs = base64.urlsafe_b64decode(bs)
        return bs
        @staticmethod
        def b64encode(b):
        return base64.urlsafe_b64encode(b).replace(b"=", b"")
        if __name__ == "__main__":
        dicts = {"username": "wangjie"}
        a = JWT.encode(dicts, 'abcedf', 300)
        b = JWT.decode(a, 'abcedf')
        print(b)

    • Base64 防君子不防小人

    • Base64生成步骤

      • 1.按三字节一组,3组共24位(3x8=24字节)分组
      • 2.在将一组分成6位(6位一组 共四组)这四组在码表中查找对应字符
      • 3.输出响应内容
      • 4.不够的需要0
    • 5.再不够补位==
    • Base64记忆点

      • 二进制转换最常用的就是Base64
      • base64转换需要是字节串
      • Base64会比原来大小大30%左右
      • Base64一定能被4整除
      • 码表中是:A-za-Z0-9/+
      • / 一定要小心,在url中容易歧义,使用urlsafe_b64encode()
      • =号是不够补位使用的,常常需要去掉=号,decode在加上
      • urlsafe_b64encode()

      • 把=和/改成了 - 和 _

      ```python
      import base64
      base64.b64encode(b'wangjie')

      注意是自己猜

      base64.b64decode(b'')
      base64.urlsafe_b64encode()

    base64去掉等号

    base64.replace(b"=",b"")
    #base64增加等号

    base64 += b"="*(4-len(base64))
    ```

    • HS256 = HMAX-SHA256

      • 哈希算法:散列值 (三大特点 md5 sha)

      • # SHA256
        import hashlib
        s = hashlib.sha256()
        s.update(b'xxx')
        s.hexdigest()
        # md5已经被攻克
        # HMAC-SHA256
        import hmac
        h = hmac.new(key,str,digestmod="SHA256")
        h.hexdigest()
        # 4.RSA256 非对称加密
        两把钥匙 公钥 私钥
        1.加密:公钥加密 私钥解密
        2.签名:私钥签名,公钥验签

  • python DICT,SET实现

    • 哈希冲撞

      • 1.根据key A进行一次hash计算,hash
      • 2.计算数组中位置,比如计算索引为0
      • 3.继续存数据,遇到哈希碰撞
    • 4.以哈希碰撞的位置(比如都是索引0),继续哈希运算hash(‘0’+data),算出不冲突的索引
      • 5.删除字典时候,如果遇到哈希碰撞使用过的索引,则用伪删除,保留索引方便继续算出字典的值
    • 扩容字典

    • 一旦空间闲置位置少于3/1进行扩充
      • 所有元素都需要从新排列
      • 拿空间换时间,无序
    • 250919354@qq.com 郭君宇
  • 4.扩展延伸知识

    • nginx和django直接

      • fastCGU
      • uWsgi
    • Python 中Json注意点

      • python字典转json
        • json.dumps(dicts, separators=(“,”,”:“))
        • 需要将空格去掉 separators=(“,”,”:”)
          • 参数1,多组keyvalue用什么分割
          • 参数2,key和value用什么分割
        • 需要排序,因为字典无序 sort_key=True

    5.知识内容个人梳理

    6.今天都复习了之前的什么内容