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 相关文章推荐
深入理解Javascript中的this关键字
Mar 27 Python
python实现批量下载新浪博客的方法
Jun 15 Python
利用Python破解验证码实例详解
Dec 08 Python
Python基于Socket实现的简单聊天程序示例
Aug 05 Python
NumPy 数学函数及代数运算的实现代码
Jul 18 Python
使用Python实现画一个中国地图
Nov 23 Python
python 实现将Numpy数组保存为图像
Jan 09 Python
解决Django部署设置Debug=False时xadmin后台管理系统样式丢失
Apr 07 Python
vscode调试django项目的方法
Aug 06 Python
Python 添加文件注释和函数注释操作
Aug 09 Python
python制作微博图片爬取工具
Jan 16 Python
一个入门级python爬虫教程详解
Jan 27 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各种编码集详解和以及在什么情况下进行使用
2011/09/11 PHP
PHP的Yii框架中Model模型的学习教程
2016/03/29 PHP
php for 循环使用的简单实例
2016/06/02 PHP
Laravel框架下的Contracts契约详解
2020/03/17 PHP
javascript,jquery闭包概念分析
2010/06/19 Javascript
AJAX跨域请求json数据的实现方法
2013/11/11 Javascript
javascript计算星座属相(十二生肖属相)示例代码
2014/01/09 Javascript
jquery实现ajax提交form表单的方法总结
2014/03/03 Javascript
js验证框架实现代码分享
2016/05/18 Javascript
Bootstrap和Angularjs配合自制弹框的实例代码
2016/08/24 Javascript
纯js实现图片匀速淡入淡出效果
2017/08/22 Javascript
对Layer UI 模块化的用法详解
2019/09/26 Javascript
解决qrcode.js生成二维码时必须定义一个空div的问题
2020/07/09 Javascript
浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑
2020/09/12 Javascript
[02:37]2015国际邀请赛选手档案—LGD.Xiao8
2015/07/28 DOTA
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python函数的周期性执行实现方法
2016/08/13 Python
django框架如何集成celery进行开发
2017/05/24 Python
Python使用pymysql小技巧
2017/06/04 Python
Python探索之修改Python搜索路径
2017/10/25 Python
Python三种遍历文件目录的方法实例代码
2018/01/19 Python
python ddt实现数据驱动
2018/03/14 Python
对Django的restful用法详解(自带的增删改查)
2019/08/28 Python
python异常处理和日志处理方式
2019/12/24 Python
Python 没有main函数的原因
2020/07/10 Python
暑假实习求职信范文
2013/09/22 职场文书
经典优秀个人求职信分享
2013/12/12 职场文书
财务会计专业个人求职信范本
2014/01/08 职场文书
给女儿的表扬信
2014/01/18 职场文书
小学生美德少年事迹
2014/02/02 职场文书
大型晚会策划方案
2014/02/06 职场文书
竞选班干部的演讲稿
2014/04/24 职场文书
课内比教学心得体会
2014/09/09 职场文书
2014年党员自我评议总结
2014/09/23 职场文书
简单的辞职信范文(2016最新版)
2015/05/12 职场文书
慰问信的写作格式及范文!
2019/06/24 职场文书