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助你微信跳一跳拿高分
Jan 08 Python
python3 读写文件换行符的方法
Apr 09 Python
解决Spyder中图片显示太小的问题
Apr 27 Python
详解多线程Django程序耗尽数据库连接的问题
Oct 08 Python
Python使用folium excel绘制point
Jan 03 Python
对python多线程SSH登录并发脚本详解
Feb 14 Python
Pytorch中的VGG实现修改最后一层FC
Jan 15 Python
无需压缩软件,用python帮你操作压缩包
Aug 17 Python
Python使用urlretrieve实现直接远程下载图片的示例代码
Aug 17 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
Oct 22 Python
Python 中 sorted 如何自定义比较逻辑
Feb 02 Python
Python中X[:,0]和X[:,1]的用法
May 10 Python
用Python爬虫破解滑动验证码的案例解析
python本地文件服务器实例教程
python字符串常规操作大全
python自动化之如何利用allure生成测试报告
python使用openpyxl库读写Excel表格的方法(增删改查操作)
Python time库的时间时钟处理
Django项目如何获得SSL证书与配置HTTPS
You might like
实例讲解PHP设计模式编程中的简单工厂模式
2016/02/29 PHP
PHP模版引擎原理、定义与用法实例
2019/03/29 PHP
JavaScript Event学习第二章 Event浏览器兼容性
2010/02/07 Javascript
jQuery遍历Form示例代码
2013/09/03 Javascript
js实现通用的微信分享组件示例
2014/03/10 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
javascript+HTML5自定义元素播放焦点图动画
2016/02/21 Javascript
jQuery Mobile框架中的表单组件基础使用教程
2016/05/17 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
2016/06/08 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
Angularjs 依赖压缩及自定义过滤器写法
2017/02/04 Javascript
Angular2 组件通信的实例代码
2017/06/23 Javascript
D3.js实现简洁实用的动态仪表盘的示例
2018/04/04 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
nodejs微信开发之授权登录+获取用户信息
2019/03/17 NodeJs
Python中os和shutil模块实用方法集锦
2014/05/13 Python
Python中处理unchecked未捕获异常实例
2015/01/17 Python
Python的Django框架安装全攻略
2015/07/15 Python
python解决Fedora解压zip时中文乱码的方法
2016/09/18 Python
Python3中简单的文件操作及两个简单小实例分享
2017/06/18 Python
基于python 字符编码的理解
2017/09/02 Python
selenium + python 获取table数据的示例讲解
2018/10/13 Python
用Python获取摄像头并实时控制人脸的实现示例
2019/07/11 Python
Python使用scrapy爬取阳光热线问政平台过程解析
2019/08/14 Python
Python 调用 Windows API COM 新法
2019/08/22 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
2020/02/25 Python
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
2018/01/10 HTML / CSS
HearthSong官网:儿童户外玩具、儿童益智玩具
2017/10/16 全球购物
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
J2SDK1.5与J2SDK5.0有什么区别
2012/09/19 面试题
水产养殖学应届生求职信
2013/09/29 职场文书
后勤人员岗位职责
2013/12/17 职场文书
办加油卡单位介绍信
2014/01/09 职场文书
现金出纳岗位职责
2014/03/15 职场文书
上班时间打瞌睡检讨书
2014/09/26 职场文书
Python机器学习之决策树和随机森林
2021/07/15 Javascript