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 相关文章推荐
Python3 入门教程 简单但比较不错
Nov 29 Python
python的绘图工具matplotlib使用实例
Jul 03 Python
Python 机器学习库 NumPy入门教程
Apr 19 Python
python 遍历目录(包括子目录)下所有文件的实例
Jul 11 Python
python http基本验证方法
Dec 26 Python
Python3批量生成带logo的二维码方法
Jun 24 Python
浅析python,PyCharm,Anaconda三者之间的关系
Nov 27 Python
Django项目使用ckeditor详解(不使用admin)
Dec 17 Python
python实现ip地址的包含关系判断
Feb 07 Python
python 检测nginx服务邮件报警的脚本
Dec 31 Python
Python WSGI 规范简介
Apr 11 Python
基于Pygame实现简单的贪吃蛇游戏
Dec 06 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
整理的9个实用的PHP库简介和下载
2010/11/09 PHP
求PHP数组最大值,最小值的代码
2011/10/31 PHP
php使用sql数据库 获取字段问题介绍
2013/08/12 PHP
php实现文件编码批量转换
2014/03/10 PHP
PHP判断文章里是否有图片的简单方法
2014/07/26 PHP
CodeIgniter针对数据库的连接、配置及使用方法
2016/03/03 PHP
PHP7扩展开发之基于函数方式使用lib库的方法详解
2018/01/15 PHP
Laravel中错误与异常处理的用法示例
2018/09/16 PHP
laravel框架之数据库查出来的对象实现转化为数组
2019/10/23 PHP
Nigma vs Alliance BO5 第三场2.14
2021/03/10 DOTA
js跟随滚动条滚动浮动代码
2009/12/31 Javascript
Extjs gridpanel 出现横向滚动条问题的解决方法
2011/07/04 Javascript
javascript两种function的定义介绍及区别说明
2013/05/02 Javascript
基于jquery的禁用右键、文本选择功能、复制按键的实现代码
2013/08/27 Javascript
jQuery ajax dataType值为text json探索分享
2013/09/23 Javascript
jQuery分别获取选中的复选框值的示例
2014/06/17 Javascript
JS中三目运算符和if else的区别分析与示例
2014/11/21 Javascript
node.js中的fs.stat方法使用说明
2014/12/16 Javascript
Javascript实现图片不间断滚动的代码
2016/06/22 Javascript
jQuery 遍历map()方法详解
2016/11/04 Javascript
vue项目tween方法实现返回顶部的示例代码
2018/03/02 Javascript
Node.js动手撸一个静态资源服务器的方法
2019/03/09 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
Vue+Vant 图片上传加显示的案例
2020/11/03 Javascript
[02:29]完美世界高校联赛上海赛区回顾
2015/12/15 DOTA
python 监听salt job状态,并任务数据推送到redis中的方法
2019/01/14 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
2019/10/14 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
2020/03/30 Python
Pandas缺失值2种处理方式代码实例
2020/06/13 Python
哥德堡通行证:Gothenburg Pass
2019/12/09 全球购物
iHerb俄罗斯:维生素、补品和天然产品
2020/07/09 全球购物
如何实现jdbc性能优化
2012/07/30 面试题
父亲婚礼答谢词
2015/01/04 职场文书
小学运动会入场口号
2015/12/24 职场文书
SpringCloud Alibaba 基本开发框架搭建过程
2021/06/13 Java/Android
Win11 Beta 预览版 22621.575 和 22622.575更新补丁KB5016694发布(附更新内容大全)
2022/08/14 数码科技