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常用的日期时间处理方法示例
Feb 08 Python
修改Python的pyxmpp2中的主循环使其提高性能
Apr 24 Python
在Python中使用判断语句和循环的教程
Apr 25 Python
Python的Django中django-userena组件的简单使用教程
May 30 Python
在Linux系统上安装Python的Scrapy框架的教程
Jun 11 Python
Django中对通过测试的用户进行限制访问的方法
Jul 23 Python
初学python的操作难点总结(新手必看篇)
Aug 03 Python
Django中url的反向查询的方法
Mar 14 Python
python读出当前时间精度到秒的代码
Jul 05 Python
django ModelForm修改显示缩略图 imagefield类型的实例
Jul 28 Python
Pytest测试框架基本使用方法详解
Nov 25 Python
python 基于opencv 绘制图像轮廓
Dec 11 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的五种设计模式
2012/09/05 PHP
Apache服务器无法使用的解决方法
2013/05/08 PHP
php+html5使用FormData对象提交表单及上传图片的方法
2015/02/11 PHP
php实现Mysql简易操作类
2015/10/11 PHP
PHP explode()函数的几个应用和implode()函数有什么区别
2015/11/05 PHP
PHP数组游标实现对数组的各种操作详解
2016/01/26 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
2019/10/18 PHP
让firefox支持IE的一些方法的javascript扩展函数代码
2010/01/02 Javascript
JS getMonth()日期函数的值域是0-11
2010/02/15 Javascript
用js编写的简单的计算器代码程序
2015/08/04 Javascript
JavaScript获取页面中超链接数量的方法
2015/11/09 Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
2016/01/23 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
原生js实现返回顶部缓冲效果
2017/01/18 Javascript
vue.js中$set与数组更新方法
2018/03/08 Javascript
JavaScript事件委托原理与用法实例分析
2018/06/07 Javascript
vue-router的HTML5 History 模式设置
2018/09/08 Javascript
Vue实现移动端左右滑动效果的方法
2018/11/27 Javascript
JS数组求和的常用方法实例小结
2019/01/07 Javascript
VUE中使用MUI方法
2019/02/12 Javascript
vue中组件的3种使用方式详解
2019/03/23 Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
2019/08/27 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
2020/10/24 Javascript
JavaScript的一些小技巧分享
2021/01/06 Javascript
[02:23]完美世界全国高校联赛街访DOTA2第一期
2019/11/28 DOTA
python利用hook技术破解https的实例代码
2013/03/25 Python
Python利用递归实现文件的复制方法
2018/10/27 Python
Python判断一个三位数是否为水仙花数的示例
2018/11/13 Python
python使用selenium实现批量文件下载
2019/03/11 Python
Transpose 数组行列转置的限制方式
2020/02/11 Python
Django使用Celery加redis执行异步任务的实例内容
2020/02/20 Python
css3圆角边框和边框阴影示例
2014/05/05 HTML / CSS
车辆年检委托书范本
2014/10/14 职场文书
房屋转让协议书(标准范本)
2016/03/21 职场文书
超级详细实用的pycharm常用快捷键
2021/05/12 Python
MySQL一劳永逸永久支持输入中文的方法实例
2022/08/05 MySQL