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的lambda匿名函数的简单介绍
Apr 25 Python
详解Python中的__init__和__new__
Mar 12 Python
python实现无证书加密解密实例
Oct 27 Python
使用Python发送各种形式的邮件的方法汇总
Nov 09 Python
Django实现组合搜索的方法示例
Jan 23 Python
解决pycharm运行时interpreter为空的问题
Oct 29 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
Nov 16 Python
Python实现合并excel表格的方法分析
Apr 13 Python
Python实现插入排序和选择排序的方法
May 12 Python
python实现邮件自动发送
Aug 10 Python
Python实现封装打包自己写的代码,被python import
Jul 12 Python
python3 字符串str和bytes相互转换
Mar 23 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
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
PHP 5.0对象模型深度探索之类的静态成员
2008/03/27 PHP
php数据库抽象层 PDO
2011/05/07 PHP
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
关于javascript document.createDocumentFragment()
2009/04/04 Javascript
ie 调试javascript的工具
2009/04/29 Javascript
通过百度地图获取公交线路的站点坐标的js代码
2012/05/11 Javascript
node.js中的querystring.unescape方法使用说明
2014/12/10 Javascript
cookie的secure属性详解
2015/04/08 Javascript
js简单的点击返回顶部效果实现方法
2015/04/10 Javascript
jQuery给div,Span, a ,button, radio 赋值与取值
2016/06/24 Javascript
移动端js图片查看器
2016/11/17 Javascript
浅谈jQuery中的$.extend方法来扩展JSON对象
2017/02/12 Javascript
Vue项目中quill-editor带样式编辑器的使用方法
2017/08/08 Javascript
Vue2.5 结合 Element UI 之 Table 和 Pagination 组件实现分页功能
2018/01/26 Javascript
VUE DOM加载后执行自定义事件的方法
2018/09/07 Javascript
JavaScript 高性能数组去重的方法
2018/09/20 Javascript
记一次Vue.js混入mixin的使用(分权限管理页面)
2019/04/17 Javascript
vue把输入框的内容添加到页面的实例讲解
2019/11/11 Javascript
原生js实现滑块区间组件
2021/01/20 Javascript
[46:48]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第三局
2016/02/25 DOTA
解决pycharm无法调用pip安装的包问题
2018/05/18 Python
pandas把所有大于0的数设置为1的方法
2019/01/26 Python
python中如何使用分步式进程计算详解
2019/03/22 Python
PyQtGraph在pyqt中的应用及安装过程
2019/08/04 Python
Python文件操作方法详解
2020/02/09 Python
利用PyTorch实现VGG16教程
2020/06/24 Python
SCDKey德国:全球领先的数字游戏市场
2019/04/09 全球购物
eDreams葡萄牙:全球最大的在线旅行社之一
2019/04/15 全球购物
造价工程师个人求职信
2013/09/21 职场文书
机械专业应届生求职信
2013/09/21 职场文书
连带责任保证书
2014/04/29 职场文书
民事诉讼代理委托书
2014/10/08 职场文书
当幸福来敲门观后感
2015/06/01 职场文书
Mysql超详细讲解死锁问题的理解
2022/04/01 MySQL
Java由浅入深通关抽象类与接口(上篇)
2022/04/26 Java/Android