Python玩转加密的技巧【推荐】


Posted in Python onMay 13, 2019

密码学俱乐部的第一条规则是:永远不要自己发明密码系统。密码学俱乐部的第二条规则是:永远不要自己实现密码系统:在现实世界中,在实现以及设计密码系统阶段都找到过许多漏洞。

Python 中的一个有用的基本加密库就叫做 cryptography 。它既是一个“安全”方面的基础库,也是一个“危险”层。“危险”层需要更加小心和相关的知识,并且使用它很容易出现安全漏洞。在这篇介绍性文章中,我们不会涵盖“危险”层中的任何内容!

cryptography 库中最有用的高级安全功能是一种 Fernet 实现。Fernet 是一种遵循最佳实践的加密缓冲区的标准。它不适用于非常大的文件,如千兆字节以上的文件,因为它要求你一次加载要加密或解密的内容到内存缓冲区中。

Fernet 支持 对称(symmetric)(即 密钥(secret key))加密方式*:加密和解密使用相同的密钥,因此必须保持安全。

生成密钥很简单:

>>> k = fernet.Fernet.generate_key() 
>>> type(k) 
<class 'bytes'>

这些字节可以写入有适当权限的文件,最好是在安全的机器上。

有了密钥后,加密也很容易:

>>> frn = fernet.Fernet(k) 
>>> encrypted = frn.encrypt(b"x marks the spot") 
>>> encrypted[:10] 
b'gAAAAABb1'

如果在你的机器上加密,你会看到略微不同的值。不仅因为(我希望)你生成了和我不同的密钥,而且因为 Fernet 将要加密的值与一些随机生成的缓冲区连接起来。这是我之前提到的“最佳实践”之一:它将阻止对手分辨哪些加密值是相同的,这有时是攻击的重要部分。

解密同样简单:

>>> frn = fernet.Fernet(k) 
>>> frn.decrypt(encrypted) 
b'x marks the spot'

请注意,这仅加密和解密字节串。为了加密和解密文本串,通常需要对它们使用 UTF-8 进行编码和解码。

20 世纪中期密码学最有趣的进展之一是 公钥(public key)加密。它可以在发布加密密钥的同时而让解密密钥保持保密。例如,它可用于保存服务器使用的 API 密钥:服务器是唯一可以访问解密密钥的一方,但是任何人都可以保存公共加密密钥。

虽然 cryptography 没有任何支持公钥加密的安全功能,但 PyNaCl 库有。PyNaCl 封装并提供了一些很好的方法来使用 Daniel J. Bernstein 发明的 NaCl 加密系统。

NaCl 始终同时 加密(encrypt)和 签名(sign)或者同时 解密(decrypt)和 验证签名(verify signature)。这是一种防止 基于可伸缩性(malleability-based)的攻击的方法,其中攻击者会修改加密值。

加密是使用公钥完成的,而签名是使用密钥完成的:

>>> from nacl.public import PrivateKey, PublicKey, Box 
>>> source = PrivateKey.generate() 
>>> with open("target.pubkey", "rb") as fpin: 
... target_public_key = PublicKey(fpin.read()) 
>>> enc_box = Box(source, target_public_key) 
>>> result = enc_box.encrypt(b"x marks the spot") 
>>> result[:4] 
b'\xe2\x1c0\xa4'

解密颠倒了角色:它需要私钥进行解密,需要公钥验证签名:

>>> from nacl.public import PrivateKey, PublicKey, Box 
>>> with open("source.pubkey", "rb") as fpin: 
... source_public_key = PublicKey(fpin.read()) 
>>> with open("target.private_key", "rb") as fpin: 
... target = PrivateKey(fpin.read()) 
>>> dec_box = Box(target, source_public_key) 
>>> dec_box.decrypt(result) 
b'x marks the spot'

最后, PocketProtector 库构建在 PyNaCl 之上,包含完整的密钥管理方案。

ps:下面看下python 加密方法总结

MD5

def md5(str):
  import hashlib
  m = hashlib.md5()
  m.update(str)
  return m.hexdigest()

 base64

import base64
 s = '我是字符串'
 a = base64.b64encode(s)
 print a
print base64.b64decode(a)
输出结果:
ztLKx9fWt/u0rg==
我是字符串

总结

以上所述是小编给大家介绍的Python玩转加密的技巧【推荐】,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python下os模块强大的重命名方法renames详解
Mar 07 Python
Python之ReportLab绘制条形码和二维码的实例
Jan 15 Python
python如何拆分含有多种分隔符的字符串
Mar 20 Python
python字典快速保存于读取的方法
Mar 23 Python
python 实时得到cpu和内存的使用情况方法
Jun 11 Python
python利用requests库进行接口测试的方法详解
Jul 06 Python
用Python编写一个高效的端口扫描器的方法
Dec 20 Python
Python实现基于socket的udp传输与接收功能详解
Nov 15 Python
python 通过视频url获取视频的宽高方式
Dec 10 Python
python中get和post有什么区别
Jun 19 Python
python安装及变量名介绍详解
Dec 12 Python
VSCODE配置Markdown及Markdown基础语法详解
Jan 19 Python
11个Python3字典内置方法大全与示例汇总
May 13 #Python
python中的数据结构比较
May 13 #Python
Python中函数的基本定义与调用及内置函数详解
May 13 #Python
python实现弹跳小球
May 13 #Python
Python开发之Nginx+uWSGI+virtualenv多项目部署教程
May 13 #Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
May 13 #Python
Python实现插入排序和选择排序的方法
May 12 #Python
You might like
WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
2008/03/28 PHP
PHP图片验证码制作实现分享(全)
2012/05/10 PHP
PHP递归创建多级目录
2015/11/05 PHP
符合标准的js表单提交的代码
2007/09/13 Javascript
阻止子元素继承父元素事件具体思路及实现
2013/05/02 Javascript
利用JS来控制键盘的上下左右键(示例代码)
2013/12/14 Javascript
JS实现向表格行添加新单元格的方法
2015/03/30 Javascript
javascript组合使用构造函数模式和原型模式实例
2015/06/04 Javascript
JS实现可展开折叠层的鼠标拖曳效果
2015/10/09 Javascript
浅析jQuery Ajax请求参数和返回数据的处理
2016/02/24 Javascript
JavaScript基础教程——入门必看篇
2016/05/20 Javascript
浅谈vue.js导入css库(elementUi)的方法
2018/03/09 Javascript
通过js示例讲解时间复杂度与空间复杂度
2019/08/06 Javascript
详解elementUI中input框无法输入的问题
2020/04/27 Javascript
利用Vue实现简易播放器的完整代码
2020/12/30 Vue.js
JavaScript代码实现微博批量取消关注功能
2021/02/05 Javascript
初步探究Python程序的执行原理
2015/04/11 Python
python中私有函数调用方法解密
2016/04/29 Python
Python贪吃蛇游戏编写代码
2020/10/26 Python
Python正则抓取网易新闻的方法示例
2017/04/21 Python
利用Python破解斗地主残局详解
2017/06/30 Python
详解Python实现多进程异步事件驱动引擎
2017/08/25 Python
Python实现矩阵加法和乘法的方法分析
2017/12/19 Python
python 读取更新中的log 或其它文本方式
2019/12/24 Python
TensorFlow的reshape操作 tf.reshape的实现
2020/04/19 Python
在Keras中实现保存和加载权重及模型结构
2020/06/15 Python
如果有两个类A,B,怎么样才能使A在发生一个事件的时候通知B
2016/03/12 面试题
《逃家小兔》教学反思
2014/02/23 职场文书
《她是我的朋友》教学反思
2014/04/26 职场文书
模具设计与制造专业求职信
2014/07/19 职场文书
婚礼新人答谢词
2015/01/04 职场文书
二胎满月酒致辞
2015/07/29 职场文书
2016年重阳节慰问信
2015/12/01 职场文书
html+css实现文字折叠特效实例
2021/06/02 HTML / CSS
springboot中一些比较常用的注解总结
2021/06/11 Java/Android
Javascript使用integrity属性进行安全验证
2021/11/07 Javascript