itsdangerous模块
使用场景:
- 在取消订阅时,可以在URL里序列化并且签名一个用户的ID或在任何的激活账户的链接或类似的情形下使用。这种情况下不需要生成一个一次性的token并把它们存到数据库中。
- 被签名的对象可以被存入cookie中或其他不可信来源,这意味着不需要在服务端保存session,这样可以降低数据库读取的次数。
- 通常签名后的信息可以安全地往返与服务端与客户端之间,这个特性可以用于将服务端的状态传递到客户端再传递回来。
签名接口:
最基本的接口是签名接口。Signer类可以用来将一个签名附加到指定的字符串上
注:sign()方法需要传bytes类型数据,不然会报错
# 发送方和接收方拥有相同的密钥--"secret-key",发送方使用密钥对发送内容进行签名,接收方使用相同的密钥对接收到的内容进行验证,看是否是发送方发送的内容
from itsdangerous import Signer
s = Signer('secret-key') # 参数传自己的密钥
s.sign(b'') #获取签名,得到的结果是签名加在传入的字符串尾部,以.分隔 # b'1234566322345663.DWnk3y4kwfTAiTJ1kNZ1mNSabOU'
# 验证字符串,使用unsign()方法:
s.unsign('1234566322345663.DWnk3y4kwfTAiTJ1kNZ1mNSabOU')
# 如果被签名的是一个unicode字符串,那么它将隐式地被转换成utf-8。然而,在反签名时,你没法知道它原来是unicode还是字节串。
# 如果反签名验证失败了,会主动抛出异常
'''itsdangerous.exc.BadSignature: Signature b'DWnk3y4kwfTAiTJ1kNZ1mNSabOUsd' does not match'''
使用时间戳签名:
如果想要可以过期的签名,可以使用TimestampSigner类,它会加入时间戳信息并签名。在反签名时,可以验证时间戳有没有过期
from itsdangerous import TimestampSigner
s1 = TimestampSigner('secret-key')
# string = s1.sign('foo') # b'foo.XSmkVg.A6ZSwzOnVlVaNCkk12Fqo4gFRQk'
# 得到签名结果后,将上面签名的代码先注释掉,然后再反签名
s1.unsign('foo.XSmkVg.A6ZSwzOnVlVaNCkk12Fqo4gFRQk', max_age=5)
# 这里设置的5s过期,那么只要反签名的时间超过5s都是过期,下面是异常信息
'''itsdangerous.exc.SignatureExpired: Signature age 34 > 5 seconds'''
序列化:
# 因为字符串难以处理,本模块也提供了一个与json或pickle类似的序列化接口。(它内部默认使用simplejson,但是可以通过子类进行修改)
from itsdangerous import Serializer
# 签名
s2 = Serializer('secret-key')
s2.dumps([1, 2, 3, 4]) # [1, 2, 3, 4].r7R9RhGgDPvvWl3iNzLuIIfELmo
# 反签名,加载数据
s2.loads('[1, 2, 3, 4].r7R9RhGgDPvvWl3iNzLuIIfELmo')
带时间戳的序列化:
from itsdangerous import TimedSerializer
# 签名
s=TimedSerializer('secret-key')
s.dumps([1,2,3,4]) # '[1, 2, 3, 4].DI7WHQ.yVOjwQWau5mVRGuVkoqa7654VXc'
s.loads('[1, 2, 3, 4].DI7WHQ.yVOjwQWau5mVRGuVkoqa7654VXc') # [1, 2, 3, 4]
s.loads('[1, 2, 3, 4].DI7WHQ.yVOjwQWau5mVRGuVkoqa7654VXc',max_age=10) # [1, 2, 3, 4]
URL安全序列化:
如果能够向只有字符受限的环境中传递可信的字符串的话,将十分有用。itsdangerous也提供了一个URL安全序列化工具
from itsdangerous import URLSafeSerializer
# 签名
s = URLSafeSerializer('secret-key')
s.dumps([1, 2, 3, 4]) # 'WzEsMiwzLDRd.wSPHqC0gR7VUqivlSukJ0IeTDgo'
# 反签名
s.loads('WzEsMiwzLDRd.wSPHqC0gR7VUqivlSukJ0IeTDgo') # [1, 2, 3, 4]
JSON Web 签名:
json web签名工作方式与原有的URL安全序列化差不多,但是会根据当前JSON Web签名
from itsdangerous import JSONWebSignatureSerializer
# 签名
s = JSONWebSignatureSerializer('secret-key')
s.dumps({'x': 42})
# 'eyJhbGciOiJIUzI1NiJ9.eyJ4Ijo0Mn0.ZdTn1YyGz9Yx5B5wNpWRL221G1WpVE5fPCPKNuc6UAo' s.dumps(0, header_fields={'v': 1}) # 'eyJhbGciOiJIUzI1NiIsInYiOjF9.MA.wT-RZI9YU06R919VBdAfTLn82_iIQD70J_j-3F4z_aM'
# 反签名
s.loads('eyJhbGciOiJIUzI1NiIsInYiOjF9.MA.wT-RZI9YU06R919VBdAfTLn82_iIQD70J_j-3F4z_aM', return_header=True) # (0, {u'alg': u'HS256', u'v': 1})
带有时间戳的JSON WEB 签名:
from itsdangerous import TimedJSONWebSignatureSerializer
s = TimedJSONWebSignatureSerializer('secret_key',10) # 设置有效期为10s
# 签名
s.dumps({'id':1})
# 反签名
s.loads('xxxxxxxxxxxx')
# 如果超过设置的有效期则反签名时抛出SignatureExpired签名过期的错误
加盐加密:
itsdangerous 中所有的类都接收一个盐的参数salt,密码学中的盐是一个和被签名的字符串存储在一起的东西,作用是防止彩虹表查找。这种盐是可以公开的。你可以将它视为一个命名空间,泄露也没事,只要密钥没泄露,攻击者就没办法破解。
使用举例:在对同一个用户的激活账户和升级vip时加入不同的盐值,即可得到不同的签名,且使用相同盐的序列化器才能成功反签名。
itsdangerous模块的更多相关文章
- Django发送邮件和itsdangerous模块的配合使用
项目需求:用户注册页面注册之后,系统会发送一封邮件到用户邮箱,用户点击链接以激活账户,其中链接中的用户信息需要加密处理一下 其中激活自己邮箱的smtp服务的操作就不在加以说明,菜鸟教程上有非常清晰的讲 ...
- python学习之itsdangerous模块
类 from itsdangerous import URLSafeTimedSerializer as ustsr class ustsr(secret_key) 参数: secret_key可以是 ...
- python学习笔记:itsdangerous模块
使用itsdangerous生成临时身份令牌 安装 pip install itsdangerous 使用 import itsdangerous salt='sdaf'#加盐 t=itsdanger ...
- Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid
Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid 上一步获取QQ登录网址之后,测试登录之后本该跳转到这个界面 但是报错了: 新建oauth_callback.html & ...
- DRF框架QQ登录功能
用户模块---QQ登录 流程图 QQ登录文档:http://wiki.connect.qq.com/%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C_oauth2-0 流程简述 ...
- QQ第三方登陆示例
先上图 若想实现QQ登录,需要成为QQ互联的开发者,审核通过才可实现.注册方法可参考链接http://wiki.connect.qq.com/%E6%88%90%E4%B8%BA%E5%BC%80%E ...
- Django项目之Web端电商网站的实战开发(二)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...
- python+Django 下JWT的使用
figure:first-child { margin-top: -20px; } #write ol, #write ul { position: relative; } img { max-wid ...
- Django下JWT的使用
前言 JWT 是 json web token 的缩写, token的作用你应该已经了解,用于识别用户身份避免每次请求都需要验证 用来解决前后端分离时的用户身份验证 在传统的web项目中 我们会在fo ...
随机推荐
- Paper | Spatially Adaptive Computation Time for Residual Networks
目录 摘要 故事 SACT机制 ACT机制 SACT机制 实验 发表在2017年CVPR. 摘要 在图像检测任务中,对于图像不同的区域,我们可以分配不同层数的网络予以处理. 本文就提出了一个基于Res ...
- 代码问题【LDES//AAAI2019】
paper:Li Y, Zhu J, Hoi S C H, et al. Robust Estimation of Similarity Transformation for Visual Objec ...
- VBA基础 - 分支和循环
概要 编程语言的基础除了数据类型, 就是控制结构了. 所谓控制结构, 主要就是分支和循环. 分支 废话不说, 直接示例代码: 单条件判断 1 Sub Test() 2 If 2 > 1 Then ...
- 记录下github 与 gitee 同时使用
参考 Gitee(码云).Github同时配置ssh key 中间有一步,创建config文件,然后测试就过不去了. 报错:Bad owner or permissions on C:\\Users\ ...
- C++ 静态库与动态库以及在 Windows上 的创建、使用
一.什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可以 ...
- 1+x 证书 Web 前端开发 CSS3 专项练习
官方QQ群 1+x 证书 Web 前端开发 CSS3 专项练习 http://blog.zh66.club/index.php/archives/196/
- Leetcode算法题 7. Reverse Integer2
7. Reverse Integer 题目描述: Given a 32-bit signed integer, reverse digits of an integer. Example 1: Inp ...
- Visual Studio Code 小记
1. 改变语言 如图: 2. 设置皮肤 如图: 3. Visual Studio Code关闭右侧预览功能 4. 关闭预览模式 5. VS Code 优秀的主题 a. Atom One Dark Th ...
- 转 tty 设备读写
转自https://feng-qi.github.io/2017/05/04/how-to-read-write-to-tty-device/ <p>这是 StackExchange 上的 ...
- Java 并发学习总结
目录 基础篇 进阶篇 并发编程的的三个概念(特性)? JMM(Java 内存模型) volatile 关键字 1. Java 内存模型(为什么要有 volatile) 2. volatile 原理 追 ...