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中声明只包含一个元素的元组数据方法
Aug 25 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
Oct 22 Python
利用python脚本如何简化jar操作命令
Feb 24 Python
tensorflow如何批量读取图片
Aug 29 Python
在Django下创建项目以及设置settings.py教程
Dec 03 Python
python 实现在shell窗口中编写print不向屏幕输出
Feb 19 Python
Python模块zipfile原理及使用方法详解
Aug 04 Python
python闭包与引用以及需要注意的陷阱
Sep 18 Python
Pycharm操作Git及GitHub的步骤详解
Oct 27 Python
用Python 执行cmd命令
Dec 18 Python
python中编写函数并调用的知识点总结
Jan 13 Python
手把手教你用Django执行原生SQL的方法
Feb 18 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
虫族 Zerg 热键控制
2020/03/14 星际争霸
PHP 匿名函数与注意事项详细介绍
2016/11/26 PHP
php 开发中加密的几种方法总结
2017/03/22 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
jQuery选中select控件 无法设置selected的解决方法
2010/09/01 Javascript
Javascript Throttle & Debounce应用介绍
2013/03/19 Javascript
用Jquery重写windows.alert方法实现思路
2013/04/03 Javascript
js 遍历json返回的map内容示例代码
2013/10/29 Javascript
不同编码的页面表单数据乱码问题解决方法
2015/02/15 Javascript
javascript最基本的函数汇总
2015/06/25 Javascript
深入理解jQuery layui分页控件的使用
2016/08/17 Javascript
小程序指纹验证的实现代码
2018/12/04 Javascript
使用Node.js写一个代码生成器的方法步骤
2019/05/10 Javascript
javascript合并两个数组最简单的实现方法
2019/09/14 Javascript
javascript严格模式详解(含严格模式与非严格模式的区别)
2019/11/12 Javascript
javascript设计模式 ? 访问者模式原理与用法实例分析
2020/04/26 Javascript
Java 生成随机字符的示例代码
2021/01/13 Javascript
[02:56]DOTA2亚洲邀请赛 VG出场战队巡礼
2015/02/07 DOTA
python3 发送任意文件邮件的实例
2018/01/23 Python
pytest中文文档之编写断言
2019/09/12 Python
IDLE下Python文件编辑和运行操作
2020/04/25 Python
使用keras时input_shape的维度表示问题说明
2020/06/29 Python
Tensorflow tensor 数学运算和逻辑运算方式
2020/06/30 Python
详解在Python中使用Torchmoji将文本转换为表情符号
2020/07/27 Python
使用gunicorn部署django项目的问题
2020/12/30 Python
Python就将所有的英文单词首字母变成大写
2021/02/12 Python
使用HTML5和CSS3表单验证功能
2017/05/05 HTML / CSS
人事专员岗位职责范本
2014/03/04 职场文书
环境卫生倡议书
2014/08/29 职场文书
歌舞青春观后感
2015/06/10 职场文书
2015年国庆节寄语
2015/08/17 职场文书
2019数学教师下学期工作总结
2019/06/27 职场文书
创业分两种人:那么哪些适合创业?,哪些适合不适合创业呢?
2019/08/23 职场文书
MySQL 数据丢失排查案例
2021/05/08 MySQL
利用Java连接Hadoop进行编程
2022/06/28 Java/Android
postgresql如何找到表中重复数据的行并删除
2023/05/08 MySQL