当前位置: 首页 > news >正文

token - 令牌

文章目录

  • token - 令牌
    • 学前须知:
      • 1,base64 '防君子不防小人'
      • 2,SHA-256 安全散列算法的一种(hash)
      • 3,HMAC-SHA256
      • 4,RSA256 非对称加密
    • 2.1 JWT - json-web-token
      • 1,三大组成
      • 2,jwt结果格式
      • 3,校验jwt规则
      • 4,pyjwt

如何解决http无状态? 采用token

token - 令牌

学前须知:

1,base64 ‘防君子不防小人’

方法作用参数返回值
b64encode将输入的参数转化为base64规则的串预加密的明文,类型为bytes;例:b‘guoxiaonao’base64对应编码的密文,类型为bytes;例:b’Z3VveGlhb25hbw==’
b64decode将base64串 解密回 明文base64密文,类型为bytes;例:b’Z3VveGlhb25hbw==’参数对应的明文,类型为bytes;例:b’guoxiaonao’
urlsafe_b64encode作用同b64encode,但是会将 ‘+‘替换成 ‘-’,将’/‘替换成’_’同b64encode同b64encode
urlsafe_b64decode作用同b64decode同b64decode同b64decode

代码演示:

import base64
#base64加密
s = b'guoxiaonao'
b_s = base64.b64encode(s)
#b_s打印结果为 b'Z3VveGlhb25hbw=='bas64.b64encode(b'guoxiaonao')#base64解密
ss = base64.b64decode(b_s)
#ss打印结果为 b'guoxiaonao'

2,SHA-256 安全散列算法的一种(hash)

​ hash三大特点:

​ 1)定长输出 2)不可逆 3) 雪崩

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

3,HMAC-SHA256

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

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

4,RSA256 非对称加密

​ 1,加密: 公钥加密,私钥解密

​ 2,签名: 私钥签名, 公钥验签

2.1 JWT - json-web-token

1,三大组成

​ 1,header

​ 格式为字典-元数据格式如下

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

​ 该部分数据需要转成json串并用base64 加密

​ 2,payload

​ 格式为字典-此部分分为公有声明和私有声明

  公共声明:JWT提供了内置关键字用于描述常见的问题

此部分均为可选项,用户根据自己需求 按需添加key,常见公共声明如下:

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

​ 私有声明:用户可根据自己业务需求,添加自定义的key,例如如下:

{'username': 'guoxiaonao'}

​ 公共声明和私有声明均在同一个字典中;转成json串并用base64加密

​ 3,signature 签名

​ 签名规则如下:

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

​ HS256(自定义的key , base64后的header + ‘.’ + base64后的payload)

​ 解释:用自定义的key, 对base64后的header + ‘.’ + base64后的payload进行hmac计算

2,jwt结果格式

​ base64(header) + ‘.’ + base64(payload) + ‘.’ + base64(sign)

​ 最终结果如下: b’eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6Imd1b3hpYW9uYW8iLCJpc3MiOiJnZ2cifQ.Zzg1u55DCBqPRGf9z3-NAn4kbA-MJN83SxyLFfc5mmM’

3,校验jwt规则

​ 1,解析header, 确认alg

​ 2,签名校验 - 根据传过来的header和payload按 alg指明的算法进行签名,将签名结果和传过来的sign进行对比,若对比一致,则校验通过

​ 3,获取payload自定义内容

4,pyjwt

​ 1,安装 pip3 install pyjwt

方法参数说明返回值
encode(payload, key, algorithm)payload: jwt三大组成中的payload,需要组成字典,按需添加公有声明和私有声明
例如: {‘username’: ‘guoxiaonao’, ‘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

PS: 若encode得时候 payload中添加了exp字段; 则exp字段得值需为 当前时间戳+此token得有效期时间, 例如希望token 300秒后过期 {‘exp’: time.time() + 300}; 在执行decode时,若检查到exp字段,且token过期,则抛出jwt.ExpiredSignatureError

In [1]: import jwt                                                              In [2]: jwt.encode({'username':'uranus'},'123456',algorithm='HS256')            
Out[2]: b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InVyYW51cyJ9.ic1HwcFawjLIa9QUyaJm348kl58WocTUfaf5IrtkiCc'In [3]: s=jwt.encode({'username':'uranus'},'123456',algorithm='HS256')          In [5]: jwt.decode(s,'123456',algorithms='HS256')                               
Out[5]: {'username': 'uranus'}In [6]: import time                                                             In [7]: s=jwt.encode({'username':'uranus','exp':time.time()+60},'123456',algorit...: hm='HS256')                                                             In [8]: jwt.decode(s,'123456',algorithms='HS256')                               
Out[8]: {'username': 'uranus', 'exp': 1586569539.474536}
http://www.lryc.cn/news/24298.html

相关文章:

  • 应用模型开发指南上新介绍
  • Dbeaver连接Hive数据库操作指导
  • 【RabbitMQ笔记09】消息队列RabbitMQ之常见方法的使用
  • Linux字符设备驱动模型之设备号
  • C++多态原理
  • PMP认证与NPDP认证哪个含金量高?
  • 改进YOLOv7-Tiny系列:首发改进结合BiFPN结构的特征融合网络,网络融合更多有效特征,高效涨点
  • PPC Insights系列:洞见安全多方图联邦
  • SQLite注入记录(目前最全、核心函数用法、布尔盲注、时间盲注、webshell、动态库,绕过方式)
  • Java简单的生成/解析二维码(zxing qrcode)
  • 若依项目导出后端响应的Excel文件流处理
  • 华为OD机试【独家】提供C语言题解 - 数组排序
  • JVM详解——内存结构
  • Jvisualvm监控Tomcat以及相关参数优化
  • 界面组件DevExpress WinForms v22.2 - 全面升级数据展示功能
  • 正点原子第一期
  • 「mysql是怎样运行的」第24章 一条记录的多幅面孔---事务的隔离级别与MVCC
  • 入门Java第十五天 线程
  • 探索用卷积神经网络实现MNIST数据集分类
  • MySQL 索引失效场景
  • Xcode开发工具,图片放入ios工程
  • 操作系统权限提升(十九)之Linux提权-SUID提权
  • 直播 | StarRocks 实战系列第三期--StarRocks 运维的那些事
  • KingabseES执行计划-分区剪枝(partition pruning)
  • Operator-sdk 在 KaiwuDB 容器云中的使用
  • 【数据挖掘】2、数据预处理
  • (四十六)大白话在数据库里,哪些操作会导致在表级别加锁呢?
  • 【Android源码面试宝典】MMKV从使用到原理分析(二)
  • 如何使用ADFSRelay分析和研究针对ADFS的NTLM中继攻击
  • 【Python学习笔记】第二十二节 Python XML 解析