2020.5.19 token生成

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


1.复习内容

2.灵感代办

3.学习内容

  • 面试

    • 离职原因:

      • 获客成本过高
      • 寻求技术突破
    • 前后端分离项目

      • 前端:客服端,负责渲染用户界面(android ios pc)
      • 后端:服务端,负责接收http请求,处理数据
      • API:application programming interface 预定义接口,用来通信
    • 前后端分离 完整请求过程

      • 1,前端通过http请求后端API
      • 2,后端以json形式返回前端数据
      • 3,前端生成用户显示界面【如html , ios , android】
    • 判断前后端分离的标准

      • 1.django或flash都不是使用render或者模板生成html
      • 2.后端只返回数据
      • 3.前端异步请求,接收json做页面渲染
    • 前后端分离的优点

      • 1.各司其职
        • 前端:视觉层面,兼容性(后端不好做兼容),性能优化(浏览器处理)
          • 后端:并发,可用性变高,性能更强
      • 2.解耦
        • 前端后端易于扩展
      • 3.通用性
        • 后端api可以让全平台使用
      • 4.前端后端并行开发
      • 5.提高用户体验
  • 前后端项目错误如何排查

    • 1.前端代码排查
    • 2.后端代码排查
    • 3.工具版本排查
  • 前后端项目分离常见问题

    • 如何解决http无状态问题

      • token
    • 安全问题,https能解决

      • 发给客户端token
    • 前端为JS,跨域怎么解决

      • jsoup
    • CORS

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

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


Ares个人进阶之路