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的Bottle框架的一些使用技巧介绍
Apr 08 Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
Apr 21 Python
Python拼接微信好友头像大图的实现方法
Aug 01 Python
Python Pexpect库的简单使用方法
Jan 29 Python
Python循环中else,break和continue的用法实例详解
Jul 11 Python
python3的UnicodeDecodeError解决方法
Dec 20 Python
python 实现list或string按指定分段
Dec 25 Python
python实现在线翻译功能
Mar 03 Python
重写django的model下的objects模型管理器方式
May 15 Python
python中的垃圾回收(GC)机制
Sep 21 Python
Python import模块的缓存问题解决方案
Jun 02 Python
Matplotlib绘制条形图的方法你知道吗
Mar 21 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
php横向重复区域显示二法
2008/09/25 PHP
用PHP读取超大文件的实例代码
2012/04/01 PHP
PHP 实现explort() 功能的详解
2013/06/20 PHP
PHP添加Xdebug扩展的方法
2014/02/12 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
2014/05/29 PHP
PHP提交表单失败后如何保留已经填写的信息
2014/06/20 PHP
php文档工具PHP Documentor安装与使用方法
2016/01/25 PHP
thinkPHP2.1自定义标签库的导入方法详解
2016/07/20 PHP
浅谈php的TS和NTS的区别
2019/03/13 PHP
禁止F5等快捷键的JS代码
2007/03/06 Javascript
List the Stored Procedures in a SQL Server database
2007/06/20 Javascript
jquery 可拖拽的窗体控件实现代码
2010/03/21 Javascript
jquery实现标题字体变换的滑动门菜单效果
2015/09/07 Javascript
JavaScript正则替换HTML标签功能示例
2017/03/02 Javascript
Vue.js基础指令实例讲解(各种数据绑定、表单渲染大总结)
2017/07/03 Javascript
原生js实现移动端Touch轮播图的方法步骤
2019/01/03 Javascript
Vue通过配置WebSocket并实现群聊功能
2019/12/31 Javascript
sharp.js安装过程中遇到的问题总结
2020/04/02 Javascript
antd-DatePicker组件获取时间值,及相关设置方式
2020/10/27 Javascript
[01:12:35]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
python映射列表实例分析
2015/01/26 Python
Python可跨平台实现获取按键的方法
2015/03/05 Python
Django小白教程之Django用户注册与登录
2016/04/22 Python
基于ID3决策树算法的实现(Python版)
2017/05/31 Python
20行Python代码实现视频字符化功能
2020/04/13 Python
浅谈Python中的模块
2020/06/10 Python
html5嵌入内容_动力节点Java学院整理
2017/07/07 HTML / CSS
HTML5 表单验证失败的提示语问题
2017/07/13 HTML / CSS
马来西亚网上购物平台:ezbuy
2018/02/13 全球购物
Timberland澳大利亚官网:全球领先的户外品牌
2019/12/10 全球购物
珍爱生命演讲稿
2014/05/10 职场文书
计算机毕业大学生求职信
2014/06/26 职场文书
公司股东出资证明书
2014/11/01 职场文书
运动会报道稿大全
2015/07/23 职场文书
2016年度继续教育学习心得体会
2016/01/19 职场文书