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.replace(b"=",b"")
#base64增加等号
base64 += b"="*(4-len(base64))
```
-
HS256 = HMAX-SHA256
-
哈希算法:散列值 (三大特点 md5 sha)
- 1.不可逆
- 2.定长
- 3.雪崩 改一个字节,整个输出就变了
- 签名 加盐
- S = ‘salt’
- S = ‘key+“salt” key是用户名
- 签名 加盐
- https://www.liaoxuefeng.com/wiki/897692888725344/923057313018752
-
# 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.今天都复习了之前的什么内容
nginx和django直接
- fastCGU
- uWsgi
Python 中Json注意点
- python字典转json
- json.dumps(dicts, separators=(“,”,”:“))
- 需要将空格去掉 separators=(“,”,”:”)
- 参数1,多组keyvalue用什么分割
- 参数2,key和value用什么分割
- 需要排序,因为字典无序 sort_key=True
6.今天都复习了之前的什么内容