Python加密与解密模块hashlib与hmac


Posted in Python onJune 05, 2022

Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。

一、hashlib加密模块

hash是一种算法(Python3.版本里使用hashlib模块代替了md5模块和sha模块,主要提供 SHA1、SHA224、SHA256、SHA384、SHA512、MD5 算法),该算法接受传入的内容,经过运算得到一串hash值。

hash值的特点:

  • 只要传入的内容一样,得到的hash值一样,可用于非明文密码传输时密码校验
  • 不能由hash值返解成内容,即可以保证非明文密码的安全性
  • 只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的,可以用于对文本的哈希处理

MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示

import hashlib

m = hashlib.md5() # 创建md5对象
b = 'hello'.encode(encoding='utf-8') # 此处必须encode, 或者 b = bytes(str, encoding='utf-8'),作用相同都是encode为bytes,将str默认的unicode转成utf-8.
m.update(b); #该方法只接受bytes类型


print(m.hexdigest())  #将hash中的数据转换成数据,其中只包含十六进制的数字。 5d41402abc4b2a76b9719d911017c592


# 另一种写法:b‘'前缀代表的就是bytes ,对英文加密,才可以使用b' '前缀,b' '在python中只能对ASCII字符进行转码。
str_md5 = hashlib.md5(b'this is a md5 test.').hexdigest() 
print('MD5加密后为 :' + str_md5)

如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的。

SHA1的生成结果是160 bit字节,通常用一个40位的16进制字符串表示。

比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法不仅越慢,而且摘要长度更长。

二、hmac 加盐加密模块

Python自带的hmac模块实现了标准的Hmac算法:Keyed-Hashing for Message Authentication。它通过一个标准算法,在计算哈希的过程中,把key混入计算过程中。它内部对我们创建key和内容做过某种处理后再加密。

和我们自定义的加salt算法不同,Hmac算法针对所有哈希算法都通用,无论是MD5还是SHA-1。采用Hmac替代我们自己的salt算法,可以使程序算法更标准化,也更安全。

我们来看看如何使用hmac实现带key的哈希。

我们首先需要准备待计算的原始消息message,随机key,哈希算法,这里采用MD5,使用hmac的代码如下:

import hmac
message = b'Hello, world!'
key = b'secret'
h = hmac.new(key, message, digestmod='MD5')
# 如果消息很长,可以多次调用h.update(msg)
h.hexdigest() # 'fa4ee7d173f2d97ee79022d1a7355bcf'

注意:要注意传入的key和message都是bytes类型,str类型需要首先编码为bytes

def hmac_md5(key, s):
    return hmac.new(key.encode('utf-8'), s.encode('utf-8'), 'MD5').hexdigest()

如果要保证hmac模块最终结果一致,必须保证:

  • hmac.new括号内指定的初始key一样
  • 无论update多少次,校验的内容累加到一起是一样的内容
import hashlib
import hmac

# 注意hmac模块只接受二进制数据的加密
h1 = hmac.new(b'hash', msg=None, digestmod=hashlib.md5)
h1.update(b'hello')
h1.update(b'world')
print(h1.hexdigest())  # 905f549c5722b5850d602862c34a763e

h2 = hmac.new(b'hash', msg=None, digestmod=hashlib.md5)
h2.update(b'helloworld')
print(h2.hexdigest())  # 905f549c5722b5850d602862c34a763e

h3 = hmac.new(b'hashhelloworld', msg=None, digestmod=hashlib.md5)
print(h3.hexdigest())  # a7e524ade8ac5f7f33f3a39a8f63fd25

到此这篇关于Python加密与解密的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。


Tags in this post...

Python 相关文章推荐
分享一个简单的python读写文件脚本
Nov 25 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
Mar 20 Python
PyQt5每天必学之组合框
Apr 20 Python
python如何生成网页验证码
Jul 28 Python
Python模块、包(Package)概念与用法分析
May 31 Python
如何利用Python模拟GitHub登录详解
Jul 15 Python
利用Python绘制Jazz网络图的例子
Nov 21 Python
解决python-docx打包之后找不到default.docx的问题
Feb 13 Python
Python如何脚本过滤文件中的注释
May 27 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
Dec 03 Python
pycharm2021激活码使用教程(永久激活亲测可用)
Mar 30 Python
Python爬虫入门案例之爬取二手房源数据
Oct 16 Python
Python日志模块logging用法
Jun 05 #Python
Python使用Beautiful Soup(BS4)库解析HTML和XML
Jun 05 #Python
Python四款GUI图形界面库介绍
Python序列化模块JSON与Pickle
Jun 05 #Python
python 判断字符串当中是否包含字符(str.contain)
Python测试框架pytest高阶用法全面详解
Python使用Web框架Flask开发项目
Jun 01 #Python
You might like
php Ajax乱码
2008/04/09 PHP
ThinkPHP实现批量删除数据的代码实例
2014/07/02 PHP
编写兼容IE和FireFox的脚本
2009/05/18 Javascript
JS判断是否为数字,是否为整数,是否为浮点数的代码
2010/04/24 Javascript
jquery中ajax学习笔记4
2011/10/16 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
随窗体滑动的小插件sticky源码
2013/06/21 Javascript
浅谈javascript的调试
2015/01/28 Javascript
JS 作用域与作用域链详解
2015/04/07 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
2015/08/15 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
第一次接触JS require.js模块化工具
2016/04/17 Javascript
Angularjs 双向绑定时字符串的转换成数字类型的问题
2017/06/12 Javascript
使用D3.js制作图表详解
2017/08/13 Javascript
React Native中Mobx的使用方法详解
2018/12/04 Javascript
详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)
2020/07/11 Javascript
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
python实现去除下载电影和电视剧文件名中的多余字符的方法
2014/09/23 Python
Python脚本文件打包成可执行文件的方法
2015/06/02 Python
numpy 计算两个数组重复程度的方法
2018/11/07 Python
python3.4爬虫demo
2019/01/22 Python
python 三元运算符使用解析
2019/09/16 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
浅谈python 调用open()打开文件时路径出错的原因
2020/06/05 Python
基于Python爬取51cto博客页面信息过程解析
2020/08/25 Python
20佳惊艳的HTML5应用程序示例分享
2011/05/03 HTML / CSS
德国网上超市:myTime.de
2019/08/26 全球购物
怎么写有吸引力的自荐信
2013/11/17 职场文书
优秀学生自我鉴定范例
2013/12/18 职场文书
销售团队获奖感言
2014/08/14 职场文书
交通违章检讨书
2014/09/21 职场文书
2015年生产车间工作总结
2015/04/22 职场文书
2015年企业工作总结范文
2015/04/28 职场文书
小学语文继续教育研修日志
2015/11/13 职场文书
MySQL官方导出工具mysqlpump的使用
2021/05/21 MySQL
Python Pandas 删除列操作
2022/03/16 Python