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 16 Python
Django配置celery(非djcelery)执行异步任务和定时任务
Jul 16 Python
Python实现的特征提取操作示例
Dec 03 Python
对Python模块导入时全局变量__all__的作用详解
Jan 11 Python
django与小程序实现登录验证功能的示例代码
Feb 19 Python
梅尔频率倒谱系数(mfcc)及Python实现
Jun 18 Python
python、Matlab求定积分的实现
Nov 20 Python
Pycharm debug调试时带参数过程解析
Feb 03 Python
使用Python构造hive insert语句说明
Jun 06 Python
Python常用库Numpy进行矩阵运算详解
Jul 21 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
Dec 14 Python
Python下opencv库的安装过程及问题汇总
Jun 11 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
DSP接收机前端设想
2021/03/02 无线电
模拟SQLSERVER的两个函数:dateadd(),datediff()
2006/10/09 PHP
php radio 单选框获取与保持值的实现代码
2010/05/15 PHP
PHP的SQL注入过程分析
2012/01/06 PHP
PHP pear安装配置教程
2016/05/14 PHP
锋利的jQuery 要点归纳(一) jQuery选择器
2010/03/21 Javascript
将字符串转换成gb2312或者utf-8编码的参数(js版)
2013/04/10 Javascript
AngularJS基础学习笔记之控制器
2015/05/10 Javascript
高性能JavaScript 重排与重绘(2)
2015/08/11 Javascript
面试常见的js算法题
2017/03/23 Javascript
关于Vue实现组件信息的缓存问题
2017/08/23 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(下)
2018/04/18 Javascript
nodejs更改项目端口号的方法
2018/05/13 NodeJs
WebPack配置vue多页面的技巧
2018/05/15 Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
2018/12/09 Javascript
利用JS代码自动删除稿件的普通弹幕功能
2019/09/20 Javascript
微信小程序工具函数封装
2019/10/28 Javascript
[01:36:19]Secret vs NB 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python设计模式之代理模式实例
2014/04/26 Python
举例讲解Python面相对象编程中对象的属性与类的方法
2016/01/19 Python
Unicode和Python的中文处理
2017/03/19 Python
python实现linux下抓包并存库功能
2018/07/18 Python
pygame游戏之旅 添加游戏介绍
2018/11/20 Python
python数据处理 根据颜色对图片进行分类的方法
2018/12/08 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
2019/03/05 Python
Python 函数绘图及函数图像微分与积分
2019/11/20 Python
python 实现压缩和解压缩的示例
2020/09/22 Python
贝斯特韦斯特酒店集团官网:Best Western
2019/01/03 全球购物
JAVA中的关键字有什么特点
2014/03/07 面试题
实习护士自我鉴定
2013/10/13 职场文书
2014年五四青年节演讲稿范文
2014/04/22 职场文书
法定代表人资格证明书
2014/09/11 职场文书
退学证明范本3篇
2014/10/29 职场文书
党员干部廉政承诺书
2015/04/28 职场文书
调解书格式范本
2015/05/20 职场文书
美容院管理规章制度
2015/08/05 职场文书