Python基础之hashlib模块详解


Posted in Python onMay 06, 2021

一、hashlib简介

1.什么叫hash:

hash是一种算法(不同的hash算法只是复杂度不一样)(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法),该算法接受传入的内容,经过运算得到一串hash值

2.hash值的特点是(hash值/产品有三大特性:):

  • 只要传入的内容一样,得到的hash值必然一样=====>要用明文传输密码文件完整性校验
  • 不能由hash值返解成内容=======》把密码做成hash值,不应该在网络传输明文密码(只能有内容返回hash值)
  • 只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的(如从网上下载文件要进行hash校验,保证网络传输没有丢包)

MD5是最常见的摘要算法,速度很快,生成结果是固定的16字节,通常用一个32位的16进制字符串表示。SHA1算法更安全点,它的结果是20字节长度,通常用一个40位的16进制字符串表示。而比SHA1更安全的算法是SHA256和SHA512等等,不过越安全的算法越慢,并且摘要长度更长

二、hash对象的方法

hash.update(arg)
更新hash对象。连续的调用该方法相当于连续的追加更新。例如m.update(a); m.update(b)相当于m.update(a+b)。注意,当数据规模较大的时候,Python的GIL在此时会解锁,用于提高计算速度。
一定要理解update()的作用,由于消息摘要是只针对当前状态产生的,所以每一次update后,再次计算hexdigest()的值都会不一样。
 
hash.digest()
返回bytes格式的消息摘要
 
hash.hexdigest()
与digest方法类似,不过返回的是两倍长度的字符串对象,所有的字符都是十六进制的数字。通常用于邮件传输或非二进制环境中。通常我们比较摘要时,比较的就是这个值!
 
hash.copy()
返回一个hash对象的拷贝

hashlib.new(name[, data])
一个通用的构造方法,name是某个算法的字符串名称,data是可选的bytes类型待摘要的数据。

>>> h = hashlib.new('sha256',b"haha")
>>> h.hexdigest()
'090b235e9eb8f197f2dd927937222c570396d971222d9009a9189e2b6cc0a2c1'

三、hashlib实际操作

1)在进行md5哈希运算前,需要对数据进行编码,否则报错

import hashlib
obj = hashlib.md5()   #构造一个hashlib的对象
obj.update("小马过河")  #update对指定字符串进行加密
print(obj)           
--------------结果:
  obj.update("小马过河")
TypeError: Unicode-objects must be encoded before hashing

2)obj是hash对象

import hashlib
obj = hashlib.md5()
obj.update("小马过河".encode("utf-8"))
print(obj,type(obj))
-------------------结果:
<md5 HASH object @ 0x001C5590> <class '_hashlib.HASH'>

3)得到字符串

import hashlib
obj = hashlib.md5()
obj.update("小马过河".encode("utf-8"))
result=obj.hexdigest()
print(result)
--------------结果:
24f67b0f6d02adc8867d612e0e0fc40a

4)给加密增添难度

import hashlib
obj = hashlib.md5("mcw@xiaoma@aaaafffff".encode("utf-8"))  #添加一些内容,提高加密复杂度。此处的字符串也要先编码,
obj.update("小马过河".encode('utf-8'))
result = obj.hexdigest()
print(result)
-------------------结果:
b11740508f28e04837f2c0e3a58cf990

5)用hashlib做成加密函数(添加基础的字符了的)

import hashlib
def get_md5(data):   #传参为需要加密的字符串
    obj = hashlib.md5("sidrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad".encode('utf-8'))
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()          
    return result
val = get_md5('123')
print(val)
--------------结果:
35093270b6352fa9721370b781f7b4d7

四、小小案例

import hashlib
USER_LIST = []
def get_md5(data):
    obj = hashlib.md5("12:;idrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad".encode('utf-8'))
    obj.update(data.encode('utf-8'))
    result = obj.hexdigest()
    return result
def register():
    print('**************用户注册**************')
    while True:
        user = input('请输入用户名:')
        if user == 'N':
            return
        pwd = input('请输入密码:')
        temp = {'username':user,'password':get_md5(pwd)}
        USER_LIST.append(temp)
def login():
    print('**************用户登陆**************')
    user = input('请输入用户名:')
    pwd = input('请输入密码:')

    for item in USER_LIST:
        if item['username'] == user and item['password'] == get_md5(pwd):
            return True
register()
result = login()
if result:
    print('登陆成功')
else:
    print('登陆失败')
------------------------结果:
**************用户注册**************
请输入用户名:小马过河
请输入密码:123456
请输入用户名:N
**************用户登陆**************
请输入用户名:小马过河
请输入密码:123456
登陆成功

到此这篇关于Python基础之hashlib模块详解的文章就介绍到这了,更多相关Python hashlib模块内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实现partial改变方法默认参数
Aug 18 Python
python自动化测试之连接几组测试包实例
Sep 28 Python
简介二分查找算法与相关的Python实现示例
Aug 26 Python
python通过elixir包操作mysql数据库实例代码
Jan 31 Python
python用BeautifulSoup库简单爬虫实例分析
Jul 30 Python
python3实现表白神器
Apr 09 Python
python xlwt如何设置单元格的自定义背景颜色
Sep 03 Python
Python文件路径名的操作方法
Oct 30 Python
基于python使用tibco ems代码实例
Dec 20 Python
Python autoescape标签用法解析
Jan 17 Python
python如何更新包
Jun 11 Python
Python使用Beautiful Soup(BS4)库解析HTML和XML
Jun 05 Python
用Python爬虫破解滑动验证码的案例解析
python本地文件服务器实例教程
python字符串常规操作大全
python自动化之如何利用allure生成测试报告
python使用openpyxl库读写Excel表格的方法(增删改查操作)
Python time库的时间时钟处理
Django项目如何获得SSL证书与配置HTTPS
You might like
初识通用数据库操作类――前端easyui-datagrid,form(php)
2015/07/31 PHP
Yii列表定义与使用分页方法小结(3种方法)
2016/07/15 PHP
超简单JS二级、多级联动的简单实例
2014/02/18 Javascript
JavaScript实现点击单元格改变背景色的方法
2016/02/12 Javascript
jQuery模拟select实现下拉菜单功能
2016/06/20 Javascript
第五篇Bootstrap 排版
2016/06/21 Javascript
微信小程序 devtool隐藏的秘密
2017/01/21 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
2017/02/17 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
node.js 中间件express-session使用详解
2017/05/20 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
利用JS hash制作单页Web应用的方法详解
2017/10/10 Javascript
微信小程序动态添加view组件的实例代码
2019/05/23 Javascript
vux-scroller实现移动端上拉加载功能过程解析
2019/10/08 Javascript
使用konva和vue-konva库实现拖拽滑块验证功能
2020/04/27 Javascript
简单了解Vue computed属性及watch区别
2020/07/10 Javascript
解决vue 给window添加和移除resize事件遇到的坑
2020/07/21 Javascript
Nodejs + sequelize 实现增删改查操作
2020/11/07 NodeJs
python OpenCV学习笔记实现二维直方图
2018/02/08 Python
Sanic框架异常处理与中间件操作实例分析
2018/07/16 Python
Python timer定时器两种常用方法解析
2020/01/20 Python
django自带的权限管理Permission用法说明
2020/05/13 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
2020/05/16 Python
pycharm 实现光标快速移动到括号外或行尾的操作
2021/02/05 Python
纯CSS实现预加载动画效果
2017/09/06 HTML / CSS
雪花秀美国官方网站:韩国著名草本护肤化妆品品牌
2016/10/19 全球购物
毕业生个人求职的自我评价
2013/10/28 职场文书
运动会通讯稿100字
2014/01/31 职场文书
《学会合作》教学反思
2014/04/12 职场文书
2014年最新大专生职业生涯规划书范文
2014/09/13 职场文书
群众路线领导干部个人对照检查材料(集锦)
2014/09/23 职场文书
幼儿园小班教师随笔
2015/08/14 职场文书
CSS实现多个元素在盒子内两端对齐效果
2021/03/30 HTML / CSS
golang http使用踩过的坑与填坑指南
2021/04/27 Golang
总结一些Java常用的加密算法
2021/06/11 Java/Android
Win11 PC上的Outlook搜索错误怎么办?
2022/07/15 数码科技