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.今天都复习了之前的什么内容