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 七种邮件内容发送方法实例
Apr 22 Python
详解Python的单元测试
Apr 28 Python
pyqt5简介及安装方法介绍
Jan 31 Python
Python3.5.3下配置opencv3.2.0的操作方法
Apr 02 Python
树莓派使用USB摄像头和motion实现监控
Jun 22 Python
python 一个figure上显示多个图像的实例
Jul 08 Python
pandas DataFrame创建方法的方式
Aug 02 Python
python 数据分析实现长宽格式的转换
May 18 Python
keras 指定程序在某块卡上训练实例
Jun 22 Python
浅谈Python类的单继承相关知识
May 12 Python
Python中的pprint模块
Nov 27 Python
Python中npy和mat文件的保存与读取
Apr 24 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
把77A收信机改造成收音机
2021/03/02 无线电
php json_encode()函数返回json数据实例代码
2014/10/10 PHP
PHP基于反射机制实现插件的可插拔设计详解
2016/11/10 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
jQuery 美元符冲突的解决方法
2010/03/28 Javascript
js DOM 元素ID就是全局变量
2012/09/20 Javascript
jQuery的live()方法对hover事件的处理示例
2014/02/27 Javascript
在for循环中length值是否需要缓存
2015/07/27 Javascript
基于JS实现回到页面顶部的五种写法(从实现到增强)
2016/09/03 Javascript
详解Angular的双向数据绑定(MV-VM)
2016/12/26 Javascript
Vue原理剖析 实现双向绑定MVVM
2017/05/03 Javascript
SeaJS中use函数用法实例分析
2017/10/10 Javascript
前后端如何实现登录token拦截校验详解
2018/09/03 Javascript
vue环形进度条组件实例应用
2018/10/10 Javascript
vant 解决tab切换插件标题样式自定义的问题
2020/11/13 Javascript
Vue多选列表组件深入详解
2021/03/02 Vue.js
[20:21]《一刀刀一天》第十六期:TI国际邀请赛正式打响,总奖金超过550万
2014/05/23 DOTA
python正则表达式去掉数字中的逗号(python正则匹配逗号)
2013/12/25 Python
在Python中使用zlib模块进行数据压缩的教程
2015/06/26 Python
详解Python核心编程中的浅拷贝与深拷贝
2018/01/07 Python
Python tornado队列示例-一个并发web爬虫代码分享
2018/01/09 Python
详谈Pandas中iloc和loc以及ix的区别
2018/06/08 Python
python 反编译exe文件为py文件的实例代码
2019/06/27 Python
使用pyshp包进行shapefile文件修改的例子
2019/12/06 Python
python构造函数init实例方法解析
2020/01/19 Python
Jmeter HTTPS接口测试证书导入过程图解
2020/07/22 Python
Python:__eq__和__str__函数的使用示例
2020/09/26 Python
结合CSS3的布局新特征谈谈常见布局方法
2016/01/22 HTML / CSS
HTML5 video循环播放多个视频的方法步骤
2020/08/06 HTML / CSS
乐天旅游香港网站:日本饭店预订
2017/11/29 全球购物
体育纪念品、亲笔签名的体育收藏品:Steiner Sports
2020/07/31 全球购物
庆元旦迎新年广播稿
2014/02/18 职场文书
移交协议书
2014/08/19 职场文书
公司年夜饭通知
2015/04/25 职场文书
Golang全局变量加锁的问题解决
2021/05/08 Golang