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设置socket代理的方法
Jan 14 Python
Python获取linux主机ip的简单实现方法
Apr 18 Python
Python备份目录及目录下的全部内容的实现方法
Jun 12 Python
浅谈Python里面小数点精度的控制
Jul 16 Python
python+Splinter实现12306抢票功能
Sep 25 Python
django做form表单的数据验证过程详解
Jul 26 Python
Python时间序列缺失值的处理方法(日期缺失填充)
Aug 11 Python
在python中利用try..except来代替if..else的用法
Dec 19 Python
基于Python获取docx/doc文件内容代码解析
Feb 17 Python
python 绘制正态曲线的示例
Sep 24 Python
Python Pandas数据分析工具用法实例
Nov 05 Python
Python中读取文件名中的数字的实例详解
Dec 25 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
phpmyadmin 常用选项设置详解版
2010/03/07 PHP
thinkPHP5.0框架URL访问方法详解
2017/03/18 PHP
浅谈使用 Yii2 AssetBundle 中 $publishOptions 的正确姿势
2017/11/08 PHP
jquery获取元素值的方法(常见的表单元素)
2013/11/15 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
javascript 中的console.log和弹出窗口alert
2016/08/30 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
详解支持Angular 2的表格控件
2017/01/19 Javascript
JavaScript装饰器函数(Decorator)实例详解
2017/03/30 Javascript
Node.js 8 中的重要新特性
2017/06/28 Javascript
mui开发中获取单选按钮、复选框的值(实例讲解)
2017/07/24 Javascript
JS实现获取word文档内容并输出显示到html页面示例
2018/06/23 Javascript
Vue slot用法(小结)
2018/10/22 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
js Array.slice的8种不同用法示例
2019/07/10 Javascript
[10:21]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster 选手采访
2021/03/11 DOTA
tornado框架blog模块分析与使用
2013/11/21 Python
Python基于select实现的socket服务器
2016/04/13 Python
基于python的七种经典排序算法(推荐)
2016/12/08 Python
python的变量与赋值详细分析
2017/11/08 Python
python3.7简单的爬虫实例详解
2019/07/08 Python
Python中新式类与经典类的区别详析
2019/07/10 Python
在python中用print()输出多个格式化参数的方法
2019/07/16 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
2020/02/20 Python
Python装饰器实现方法及应用场景详解
2020/03/26 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
2020/05/25 Python
CSS3属性background-size使用指南
2014/12/09 HTML / CSS
adidas旗下高尔夫装备供应商:TaylorMade Golf(泰勒梅高尔夫)
2016/08/28 全球购物
英国No.1文具和办公用品在线:Euroffice
2016/09/21 全球购物
Guess欧洲官网:美国服饰品牌
2019/08/06 全球购物
Optimalprint加拿大:在线打印服务
2020/04/03 全球购物
大学生两会学习心得体会
2014/03/10 职场文书
工作散漫检讨书
2014/09/16 职场文书
食品质检员岗位职责
2015/04/08 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书
MySQL读取JSON转换的方式
2022/03/18 MySQL