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}
token - 令牌相关推荐
- .NET WebAPI 用ActionFilterAttribute实现token令牌验证与对Action的权限控制
项目背景是一个社区类的APP(求轻吐...),博主主要负责后台业务及接口.以前没玩过webAPI,但是领导要求必须用这个(具体原因鬼知道),只好硬着头皮上了. 最近刚做完权限这一块,分享出来给大家.欢 ...
- PHP Token(令牌)设计
转载链接:http://www.jb51.net/article/13756.htm PHP Token(令牌)设计 设计目标: 避免重复提交数据. 检查来路,是否是外部提交 匹配要执行的动作(如果有 ...
- 微信小程序+TP5——token令牌生成
token令牌的作用:客户端每次登录服务器端都会生成一个唯一的token令牌值,并返回到客户端,而服务器端会默认将token令牌值作为key, 用户信息作为value,一一对应存入缓存中,当用户每一次 ...
- 【转】在ASP.NET Web API 2中使用Owin基于Token令牌的身份验证
基于令牌的身份验证 基于令牌的身份验证主要区别于以前常用的基于cookie的身份验证,基于cookie的身份验证在B/S架构中使用比较多,但是在Web Api中因其特殊性,基于cookie的身份验证已 ...
- Springboot token令牌验证解决方案 在SpringBoot实现基于Token的用户身份验证
Springboot token令牌验证解决方案 在SpringBoot实现基于Token的用户身份验证 参考文章: (1)Springboot token令牌验证解决方案 在SpringBoot实现 ...
- 什么是Token(令牌)
Acess Token 访问资源接口(API)时所需要的资源凭证 简单token 的组成: uid(用户唯一的身份标识) .time (当前时间的时间戳) ,sign(签名,token的前几位以has ...
- token令牌的含义和操作
token 令牌的含义: 是一个加密后的字符串,可以保存信息,也可以设置信息的有效期. token的操作步骤 1.生成token,并且设置和保存数据和有效期(加密过程) 2.返回给前端进行保存 3.前 ...
- AOP+自定义注解token令牌和参数防重复提交实战
目录 一.哪些因素会引起重复提交? 二.重复提交会带来哪些问题? 三.订单的防重复提交你能想到几种方案? 四.自定义注解方式 4.1Java核心知识-自定义注解(先了解下什么是自定义注解) 4.1.1 ...
- node连接数据库;webpack;token令牌的实现;CommonJs规范;websocket
node连接数据库 安装mysql 插件:npm i mysql //1.引入 const mysql =require("mysql"); //2.创建连接对象 //使用crea ...
最新文章
- 7.2集合类型操作符
- 插入排序Insertion sort 2
- luogu1991 无线通讯网
- python图例位置_Python | 图例位置
- JasperReports项目中的应用
- 每日学习之 2016.07.27
- vc++6.0工具栏自绘按钮程序
- 全局变量不能放在头文件其中
- 东芝2303am维护清零_东芝打印机怎么清零
- 常见手机定位方式浅谈
- python解压rar、zip压缩包
- Photoshop教程_PS渐变工具找不到,怎样导入ps渐变样式?ps渐变使用教程.
- 恒生电子:控股股东恒生集团股权变更已完成工商变更登记手续
- html5+一屏一区域内容,iPhoneX页面安全区域与内容重叠问题
- bzoj5185 [Usaco2018 Jan]Lifeguards(dp+单调队列优化)
- 如何理解ANOVA中的F值与P值
- 如何更改AD域安全策略-密码必须符合复杂性要求
- 腾讯云服务器安装java服务部署环境
- Matlab pdepd函数偏微分方程的求解问题
- 怎么在Arcgis中提取多个坐标点的dem值(高程)
热门文章
- 实现canvas圆形橡皮檫像素清空功能
- stata学习笔记|异方差问题
- 优秀简历只需一篇就能打天下
- 苹果CMS、海洋CMS自动定时采集-可采集任意自定义指定资源
- 量子计算(十四):超导量子芯片
- 关于“Connection refused: connect”错误
- 用计算机用u盘怎么切换,u盘上的东西换个电脑就不见了怎么办啊
- nacos access log日志占用磁盘
- 量子计算机每次秒可达多少次,激光脉冲让运算速度提升百万倍 量子计算机有望实现室温运行...
- rtk定位权限_RTK定位原理概述