博客链接地址:http://www.zhuyannan.top/itsdangerous-加密你的数据/

如果你想向不可信的环境发送数据,但又担心数据被别人利用,就可以使用 itsdangerous来加密签名你的数据。

接收者可以破译内容,来看看你的包裹里有什么,但他们没办法修改你的内容,除非他们也有你的密钥。itsdangerous内部默认使用了HMAC和SHA1来签名,基于 Django 签名模块。它也支持JSON Web 签名 (JWS)。这个库采用BSD协议,由Armin Ronacher编写,而大部分设计与实现的版权归Simon Willison和其他的把这个库变为现实的Django爱好者们。0.安装1pip install itsdangerous1.签名接口

Signer 类可以用来将一个签名附加到指定的字符串上,这个是最基本的签名接口1

2

3

4

5

6In [1]: from itsdangerous import Signer

In [2]: s = Signer('secret_key')

In [3]: s.sign(b'hello')

Out[3]: b'hello.v8Y625GovH2FcEWU_j5w1klqs0I'

可以看出,签名被加到字符串 hello 的尾部,并且以 . 隔开。(注意:这里的 sign() 需要传bytes类型数据,不然会报错)

如果要反签名,使用 unsign() 方法:1

2In [4]: s.unsign('hello.v8Y625GovH2FcEWU_j5w1klqs0I') # 这里也可以传bytes数据

Out[4]: b'hello'

如果反签名失败,会得到 BadSignature 的异常。2.使用时间戳签名

如果想要签名可以过期,可以使用 TimeStampSigner 类,它会加入时间戳信息并签名。1

2

3

4

5

6

7

8In [6]: from itsdangerous import TimestampSigner

In [7]: s = TimestampSigner('secret_key')

In [8]: string = s.sign('hello')

In [9]: string

Out[9]: b'hello.DmZg2g.idiRG3HJdMzUNN-di8LXHKiEW5s'

反签名时,可以验证码时间戳是否过期1

2

3

4

5

6

7In [10]: s.unsign(string) # 没有输入有效期,是可以直接反签名

Out[10]: b'hello'

In [11]: s.unsign(string,max_age=5)  # 输入有效期 5s

SignatureExpired         Traceback (most recent call last)

.....

SignatureExpired: Signature age 48 > 5 seconds

可以看出在反签名时,我输入了5s的有效期,但是进行反签名时,已经过了48s,所以报错了,提示 Signature age 48 > 5 seconds3.序列化

对于非字符串的数据,Signer 类处理不了,这个模块也提供了类似 json 的序列化接口 —-> Serializer 类

签名使用 Serializer 对象的 dumps() ,反签名使用 loads()1

2

3

4

5

6

7

8

9In [13]: from itsdangerous import Serializer

In [14]: s = Serializer('secret_key')

In [15]: s.dumps({'name':'zhangsan','age':18})

Out[15]: '{"name": "zhangsan", "age": 18}.SQd5BPTqTZQ4vLOEN7PKBYWMsas'

In [16]: s.loads('{"name": "zhangsan", "age": 18}.SQd5BPTqTZQ4vLOEN7PKBYWMsas')

Out[16]: {'name': 'zhangsan', 'age': 18}4.URL安全序列化

如果要想向不可信的环境传递数据,可以使用URL安全序列化工具1

2

3

4

5

6

7

8

9In [23]: from itsdangerous import URLSafeSerializer

In [25]: s = URLSafeSerializer('secret_key')

In [26]: s.dumps([1,2,3])

Out[26]: 'WzEsMiwzXQ.1JvL0-RdbHYdszhKCATOTdQEZl0'

In [27]: s.loads('WzEsMiwzXQ.1JvL0-RdbHYdszhKCATOTdQEZl0')

Out[27]: [1, 2, 3]

同样也有添加时间戳的URL安全序列化类 URLSafeTimedSerializer,就不举例了5.JSON WEB 签名

它的工作方式与URL安全序列化器差不多1

2

3

4

5

6

7

8

9

10In [29]: from itsdangerous import JSONWebSignatureSerializer

In [30]: s = JSONWebSignatureSerializer('secret_key')

In [31]: s.dumps({'name':'mike'})

Out[31]: b'eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoibWlrZSJ9.A9eujaivW63mvCSmz_6KVT6sDtLneBe3U62wCoSellY'

In [32]: s.loads('eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoibWlrZSJ9.A9eujaiv

...: W63mvCSmz_6KVT6sDtLneBe3U62wCoSellY')

Out[32]: {'name': 'mike'}

但是会根据当前 JSON Web签名(JWS) 草案(10) [draft-ietf-jose-json-web-signature] 来生成 header。

签名时可以传入header_fields 参数,反签名传入return_header=True 参数来得到 header1

2

3

4

5

6In [34]: s.dumps({'name':'mike'},header_fields={'myheader':123})

Out[34]: b'eyJteWhlYWRlciI6MTIzLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoibWlrZSJ9.mE-UAcsVsqisJj6EIOF1ocahGdRz5cbZyyySF39OREQ'

In [35]: s.loads('eyJteWhlYWRlciI6MTIzLCJhbGciOiJIUzI1NiJ9.eyJuYW1lI

...: joibWlrZSJ9.mE-UAcsVsqisJj6EIOF1ocahGdRz5cbZyyySF39OREQ',return_header=True)

Out[35]: ({'name': 'mike'}, {'myheader': 123, 'alg': 'HS256'})

加载回来的header里还包含当前使用的算法 {‘alg’: ‘HS256’},itsdangerous 目前只提供HMAC SHA的派生算法以及不使用算法,不支持基于ECC的算法。6.TimedJSONWebSignatureSerializer

带有时间戳的JSON WEB 签名1

2

3

4

5

6

7

8

9

10

11

12

13In [42]: from itsdangerous import TimedJSONWebSignatureSerializer

In [43]: s = TimedJSONWebSignatureSerializer('secret_key',10)  # 设置有效期为 10s

In [44]: s.dumps({'id':1})

Out[44]: b'eyJhbGciOiJIUzI1NiIsImlhdCI6MTUzNTQzNTg3NSwiZXhwIjoxNTM1NDM1ODg1fQ.eyJpZCI6MX0.vZ5fDRR1-zBJk2nOH7kpdQIxvEv8dru0C3o_wuagIec'

In [45]: s.loads('eyJhbGciOiJIUzI1NiIsImlhdCI6MTUzNTQzNTg3NSwiZXhwIj

...: oxNTM1NDM1ODg1fQ.eyJpZCI6MX0.vZ5fDRR1-zBJk2nOH7kpdQIxvEv8dr

...: u0C3o_wuagIec')

Traceback (most recent call last)

.....

SignatureExpired: Signature expired

可以看出,反签名时抛出 SignatureExpired 签名过期的错误,原因是因为我设置了有效期10s,但是我执行反签名时,时间已经过了 10s 的有效期。7.加盐加密

itsdangerous 中所有的类都接收一个盐的参数,密码学中的盐是一个和被签名的字符串存储在一起的东西,作用是防止彩虹表查找。这种盐是可以公开的。你可以将它视为一个命名空间,泄露也没事,只要密钥没泄露,攻击者就没办法破解。

举个简单的例子来演示:

假设你想签名链接,一个邮箱激活链接,一个邮箱升级VIP的链接,签名都是 user ID,那么在激活和升级时就可以复用这个可变的部分,但是可以在签名的地方加上更多信息,使用不同的盐来说明你的意图。1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19In [36]: s = URLSafeSerializer('scret_key',salt='verify_salt')  # 激活使用的盐

In [37]: s.dumps(10)   # 假设用户的 id=10

Out[37]: 'MTA.jz5Oj-RsTztx1o0KQhhjdEL2z9E'

In [38]: s_vip = URLSafeSerializer('secret_key',salt='vip_salt') # 升级vip使用的盐

In [39]: s_vip.dumps(10)

Out[39]: 'MTA.j_qvVU-kNlTimdlgMty0qcy_618'

# 反签名时,使用 salt=vip_salt 的对象去加载 salt='verify_salt' 对象,就会报签名错误

In [40]: s_vip.loads(s.dumps(10))

Traceback (most recent call last)

.....

BadSignature: Signature b'jz5Oj-RsTztx1o0KQhhjdEL2z9E' does not match

# 使用相同盐的序列化器才能成功反签名

In [41]: s_vip.loads(s_vip.dumps(10))

Out[41]: 10

python 密码学 模块_python学习-itsdangerous模块-黑马程序员技术交流社区相关推荐

  1. puts遇到空格无法输出_输入一句英文,只包含字母和空格,如何输出这句英文中.....-黑马程序员技术交流社区...

    //输入一句英文,只包含字母和空格,如何输出这句英文中的最长单词?再把每个单词的首字母转换成大写! #include #include int main(int argc, const char * ...

  2. python设计游戏的背景_04_游戏背景 — 黑马程序员《Python入门教程完整版》笔记...

    游戏背景 黑马程序员<Python入门教程完整版>笔记 - 黑马程序员<Python入门教程完整版>笔记 目标背景交替滚动的思路确定 显示游戏背景 01. 背景交替滚动的思路确 ...

  3. 【Python飞机大战游戏实战+笔记】黑马程序员Python教程项目实战记录【超详细】

    博主在哔哩哔哩上学习了黑马程序员的python教程,并且完成了老师讲的项目实战,为了巩固知识点通过这篇博客来记录一下. 目录 1. 创建python项目+pygame模块下载 1.1 创建项目 1.2 ...

  4. python从入门到高阶(基于黑马程序员python教程)

    文章目录 0.文章来源 1."学it就来%s%s员"% (name,"程序员") 2.%s:占位字符串.%d:占位整型.%f:占位浮点型 3.字符串格式化的精度 ...

  5. 黑马程序员 python 基础版 哪个老师_(看黑马程序员Python基础班视频挺好,犹豫该不该报班?)...

    看黑马程序员Python基础班视频挺好,犹豫该不该报班? 如果看视频比较好的话,还是建议自学吧,毕竟录制视频的老师不一定参与实质的讲课,且能自学也省一笔培训费用了.我是看的bilibili上黑马程序员 ...

  6. jQuery学习笔记【黑马程序员】

    文章目录 前言 JQury学习 1.引入JQury 2.jqury简介 3.jQuery入口函数 4.dom对象与jQuery对象 4.1.dom对象 4.2.jQuery对象 4.3.jQuery对 ...

  7. 学习笔记:黑马程序员C++从0到1(3~4)

    黑马程序员C++从0到1入门编程 3 运算符 3.1 算术运算符 3.2 赋值运算符 3.3 比较运算符 3.4 逻辑运算符 4 程序流程结构 4.1 选择结构 4.1.1 If 语句 4.1.1.1 ...

  8. python ca模块_python学习之模块-模块(五)

    5.10 包 5.10.1 包的概念 [官网解释] Packages are a way of structuring Python's module namespace by using " ...

  9. python语言模型工具_Python工具整合,为程序员和新手准备的 8 大 Python 工具

    Python 是一种开源编程语言,用于 Web 编程.数据科学.人工智能和许多科学应用.学习 Python 使程序员能够专注于解决问题,而不是专注于语法,其丰富的库赋予它完成伟大任务所需的力量. 1) ...

最新文章

  1. Oracle中文乱码解决办法总结
  2. Jetty Groovy AppServer
  3. python简介怎么写-python简历模板范文
  4. Hibernate---架构
  5. SPOJ - QTREE3Query on a tree again!——树链剖分
  6. long mode 分页_在Spring Boot中使用Spring-data-jpa实现分页查询(转)
  7. mysql查询今天_昨天_7天_近30天_本月_上一月 数据_(转载)mysql查询今天、昨天、7天、近30天、本月、上一月数据...
  8. linux systemd命令,systemd命令
  9. linux下maxwell安装教程,Ubuntu下若干软件的安装方法
  10. 软件测试是不是IT行业最容易学的 ,大概需要多长时间,就业前景好吗?
  11. 家庭版win7怎么把计算机,win7系统旗舰版如何变回家庭版
  12. BZOJ.4340.[BJOI2015]隐身术(后缀数组 搜索)
  13. Jetson nano 开机自动连接 Wifi
  14. 360断网急救箱 dns服务器未响应,发现DNS服务异常,用360断网急救箱修复后过一段时间又复发。怎么办?...
  15. python连接oracle12c
  16. 金弘同创教育:拼多多店铺分数多久清算一次
  17. 简单彩票中奖实现-Demo
  18. UOS开机之后进入emergency mode“journalctl -xb”
  19. 【NISP一级】4.1 Windows终端安全
  20. Linux文件和目录管理(2)

热门文章

  1. CoreCLR源码探索(六) NullReferenceException是如何发生的
  2. .Net Core上用于代替System.Drawing的类库
  3. Windows Server 2016提供Docker原生运行的企业级支持
  4. 过多提交(Over Posting)
  5. java jtable defaulttablemodel_java – JTable和DefaultTableModel
  6. WPF 用代码实现WrapPanel右侧自动对齐(解决多余空白问题)
  7. 【QGIS入门实战精品教程】9.1:QGIS构建泰森多边形(Thiessen Polygon)实例精解
  8. 西北师范大学地理与环境科学学院考研真题汇总(高等数学)持续更新。。。
  9. C#创建桌面快捷方式
  10. linux环境下用TcpDump抓包分析总结