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获取当前时间的方法
Jan 14 Python
python使用webbrowser浏览指定url的方法
Apr 04 Python
Perl中著名的Schwartzian转换问题解决实现
Jun 02 Python
python版本的读写锁操作方法
Apr 25 Python
Python调用ctypes使用C函数printf的方法
Aug 23 Python
python中map()函数的使用方法示例
Sep 29 Python
Python中修改字符串的四种方法
Nov 02 Python
解决python3 Pycharm上连接数据库时报错的问题
Dec 03 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
Apr 29 Python
Python3 读取Word文件方式
Feb 13 Python
利用Python制作动态排名图的实现代码
Apr 09 Python
详解Golang如何实现支持随机删除元素的堆
Sep 23 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
将二维数组转为一维数组的2种方法
2014/05/26 PHP
javascript AutoScroller 函数类
2009/05/29 Javascript
js的一些常用方法小结
2011/06/29 Javascript
js验证是否为数字的总结
2013/04/14 Javascript
JQuery对class属性的操作实现按钮开关效果
2013/10/11 Javascript
巧用replace将文字表情替换为图片
2014/04/17 Javascript
js编写贪吃蛇的小游戏
2020/08/24 Javascript
JavaScript拖拽、碰撞、重力及弹性运动实例分析
2016/01/08 Javascript
Javascript单例模式的介绍和实例
2016/10/08 Javascript
JS原型与原型链的深入理解
2017/02/15 Javascript
jQuery插件FusionCharts实现的3D柱状图效果实例【附demo源码下载】
2017/03/03 Javascript
基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )
2017/03/30 Javascript
JQuery 获取多个select标签option的text内容(实例)
2017/09/07 jQuery
jQuery代码优化方法总结
2018/01/29 jQuery
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
VUE 实现滚动监听 导航栏置顶的方法
2018/09/11 Javascript
微信小程序实现批量倒计时功能
2020/11/01 Javascript
[17:00]DOTA2 HEROS教学视频教你分分钟做大人-帕克
2014/06/10 DOTA
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
Python网络编程中urllib2模块的用法总结
2016/07/12 Python
python 实现敏感词过滤的方法
2019/01/21 Python
使用python PIL库实现简单验证码的去噪方法步骤
2019/05/10 Python
python issubclass 和 isinstance函数
2019/07/25 Python
Django 权限管理(permissions)与用户组(group)详解
2020/11/30 Python
HTML5文档结构标签
2017/04/21 HTML / CSS
详解HTML5中download属性的应用
2015/08/06 HTML / CSS
Zooplus罗马尼亚:宠物食品和配件
2019/11/02 全球购物
介绍java中初始化块的使用
2012/09/11 面试题
27个经典Linux面试题及答案,你知道几个?
2013/01/10 面试题
UNIX操作系统结构由哪几部分组成
2016/02/17 面试题
高三体育教学反思
2014/01/29 职场文书
2014社区三八妇女节活动方案
2014/03/30 职场文书
中班幼儿评语大全
2014/04/30 职场文书
2015元旦晚会主持词(开场白+结束语)
2014/12/14 职场文书
2019年世界儿童日宣传标语
2019/11/22 职场文书
Requests什么的通通爬不了的Python超强反爬虫方案!
2021/05/20 Python