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实现简单socket程序在两台电脑之间传输消息的方法
Mar 13 Python
在Linux上安装Python的Flask框架和创建第一个app实例的教程
Mar 30 Python
Python 中的with关键字使用详解
Sep 11 Python
小白如何入门Python? 制作一个网站为例
Mar 06 Python
python pandas修改列属性的方法详解
Jun 09 Python
Python设计模式之组合模式原理与用法实例分析
Jan 11 Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
May 10 Python
Python3 串口接收与发送16进制数据包的实例
Jun 12 Python
python数据预处理之数据标准化的几种处理方式
Jul 17 Python
Python enumerate内置库用法解析
Feb 24 Python
Pycharm无法打开双击没反应的问题及解决方案
Aug 17 Python
Python实现FTP文件定时自动下载的步骤
Dec 19 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/11/27 PHP
curl实现站外采集的方法和技巧
2014/01/31 PHP
Thinkphp搜索时首页分页和搜索页保持条件分页的方法
2014/12/05 PHP
PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法
2016/05/13 PHP
CodeIgniter记录错误日志的方法全面总结
2016/05/17 PHP
JavaScript Base64编码和解码,实现URL参数传递。
2006/09/18 Javascript
JavaScript中判断对象类型的几种方法总结
2013/11/11 Javascript
理解javascript定时器中的setTimeout与setInterval
2016/02/23 Javascript
jQuery实现微信长按识别二维码功能
2016/08/26 Javascript
微信js-sdk界面操作接口用法示例
2016/10/12 Javascript
javascript设计模式之策略模式学习笔记
2017/02/15 Javascript
Angular 输入框实现自定义验证功能
2017/02/19 Javascript
Angular如何引入第三方库的方法详解
2017/07/13 Javascript
vue.js 使用axios实现下载功能的示例
2018/03/05 Javascript
js中数组常用方法总结(推荐)
2019/04/09 Javascript
详解Nuxt.js中使用Element-UI填坑
2019/09/06 Javascript
Vue实现渲染数据后控制滚动条位置(推荐)
2019/12/09 Javascript
python数组复制拷贝的实现方法
2015/06/09 Python
Saltstack快速入门简单汇总
2016/03/01 Python
python实现人脸识别代码
2017/11/08 Python
TensorFlow模型保存和提取的方法
2018/03/08 Python
VScode编写第一个Python程序HelloWorld步骤
2018/04/06 Python
Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能
2018/11/23 Python
Python实现微信机器人的方法
2019/09/06 Python
Python爬取豆瓣视频信息代码实例
2019/11/16 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
2020/04/26 Python
新加坡网上化妆品店:Best Buy World
2018/05/18 全球购物
新加坡第一的杂货零售商:NTUC FairPrice
2020/12/05 全球购物
应届生体育教师自荐信
2013/10/03 职场文书
年度优秀员工获奖感言
2014/08/15 职场文书
公司证明怎么写
2014/09/22 职场文书
2014年最新离婚协议书范本
2014/10/11 职场文书
新党章的学习心得体会
2014/11/07 职场文书
2016年学习贯彻十八届五中全会精神心得体会
2016/01/05 职场文书
因个人工作失误检讨书
2019/06/21 职场文书
多表查询、事务、DCL
2021/04/05 MySQL