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之引用和类属性的初步理解
May 15 Python
Python对两个有序列表进行合并和排序的例子
Jun 13 Python
Python导入txt数据到mysql的方法
Apr 08 Python
在Python中实现shuffle给列表洗牌
Nov 08 Python
详解Python odoo中嵌入html简单的分页功能
May 29 Python
解决pyqt5中QToolButton无法使用的问题
Jun 21 Python
python实现网站微信登录的示例代码
Sep 18 Python
Flask和pyecharts实现动态数据可视化
Feb 26 Python
Python爬虫之爬取淘女郎照片示例详解
Jul 28 Python
python pymysql库的常用操作
Oct 16 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
Nov 05 Python
Python探索生命起源 matplotlib细胞自动机动画演示
Apr 21 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
《忧国的莫里亚蒂》先导宣传图与STAFF公开
2020/03/04 日漫
php 购物车实例(申精)
2009/05/11 PHP
PHP读取PDF内容配合Xpdf的使用
2012/11/24 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
用CSS+JS实现的进度条效果效果
2007/06/05 Javascript
基于jQuery图片平滑连续滚动插件
2009/04/27 Javascript
js文本框输入点回车触发确定兼容IE、FF等
2013/11/19 Javascript
AngularJS directive返回对象属性详解
2016/03/28 Javascript
Vue.js第二天学习笔记(vue-router)
2016/12/01 Javascript
jQuery获取选中单选按钮radio的值
2016/12/27 Javascript
js提取中文拼音首字母的封装工具类
2018/03/12 Javascript
vue构建动态表单的方法示例
2018/09/22 Javascript
如何进行微信公众号开发的本地调试的方法
2019/06/16 Javascript
编写Python脚本把sqlAlchemy对象转换成dict的教程
2015/05/29 Python
python制作一个桌面便签软件
2015/08/09 Python
Django实现自定义404,500页面教程
2017/03/26 Python
深入理解Python中的内置常量
2017/05/20 Python
解决pycharm回车之后不能换行或不能缩进的问题
2019/01/16 Python
python多线程实现TCP服务端
2019/09/03 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
2019/12/19 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
2020/01/14 Python
Python编程快速上手——Excel表格创建乘法表案例分析
2020/02/28 Python
Python依赖包迁移到断网环境操作
2020/07/13 Python
一篇文章带你学习CSS3图片边框
2020/11/04 HTML / CSS
HTML5实现可缩放时钟代码
2017/08/28 HTML / CSS
英国快时尚女装购物网站:PrettyLittleThing
2018/08/15 全球购物
创建索引时需要注意的事项
2013/05/13 面试题
上课说话检讨书大全
2014/01/22 职场文书
九年级语文教学反思
2014/02/04 职场文书
服务标语大全
2014/06/18 职场文书
小区门卫的岗位职责
2014/09/26 职场文书
杨善洲电影观后感
2015/06/04 职场文书
惊涛骇浪观后感
2015/06/05 职场文书
胡桃夹子观后感
2015/06/11 职场文书
详解Go语言运用广度优先搜索走迷宫
2021/06/23 Python
Java多条件判断场景中规则执行器的设计
2021/06/26 Java/Android