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 生成不重复的随机数的代码
May 15 Python
详解Python中的序列化与反序列化的使用
Jun 30 Python
Python脚本暴力破解栅栏密码
Oct 19 Python
Python 循环语句之 while,for语句详解
Apr 23 Python
python-opencv 将连续图片写成视频格式的方法
Jan 08 Python
Python进阶之全面解读高级特性之切片
Feb 19 Python
python selenium 弹出框处理的实现
Feb 26 Python
Python 仅获取响应头, 不获取实体的实例
Aug 21 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
Sep 16 Python
python 实现生成均匀分布的点
Dec 05 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
Jun 22 Python
tensorflow基于CNN实战mnist手写识别(小白必看)
Jul 20 Python
用Python爬虫破解滑动验证码的案例解析
python本地文件服务器实例教程
python字符串常规操作大全
python自动化之如何利用allure生成测试报告
python使用openpyxl库读写Excel表格的方法(增删改查操作)
Python time库的时间时钟处理
Django项目如何获得SSL证书与配置HTTPS
You might like
《PHP边学边教》(02.Apache+PHP环境配置――下篇)
2006/12/13 PHP
一个简单的php加密解密函数(动态加密)
2013/06/19 PHP
浅析HTTP消息头网页缓存控制以及header常用指令介绍
2013/06/28 PHP
php 表单提交大量数据发生丢失的解决方法
2014/03/03 PHP
php初始化对象和析构函数的简单实例
2014/03/11 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
JAVASCRIPT 对象的创建与使用
2021/03/09 Javascript
JS遮罩层效果 兼容ie firefox jQuery遮罩层
2010/07/26 Javascript
javascript 防止刷新,后退,关闭
2010/08/07 Javascript
JavaScript中匿名函数用法实例
2015/03/23 Javascript
jQuery中prepend()方法使用详解
2015/08/11 Javascript
Javascript刷新窗口方法小结
2015/10/21 Javascript
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
微信小程序canvas实现刮刮乐效果
2018/07/09 Javascript
jquery制作的移动端购物车效果完整示例
2020/02/24 jQuery
[05:36]DOTA2 2015国际邀请赛中国区预选赛第四日TOP10
2015/05/29 DOTA
深入解析Python中的WSGI接口
2015/05/11 Python
使用Python导出Excel图表以及导出为图片的方法
2015/11/07 Python
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
pyqt5中QThread在使用时出现重复emit的实例
2019/06/21 Python
Django框架创建mysql连接与使用示例
2019/07/29 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
2019/12/12 Python
python画图常规设置方式
2020/03/05 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
SHEIN香港:价格实惠的女性时尚服装
2018/08/14 全球购物
Chicco婴儿用品美国官网:汽车座椅、婴儿推车、高脚椅等
2018/11/05 全球购物
美国购买舞会礼服网站:Couture Candy
2019/12/29 全球购物
诺思信科技(南京)有限公司.NET笔试题答案
2013/07/06 面试题
软件缺陷的分类都有哪些
2014/08/22 面试题
企业厂务公开实施方案
2014/03/26 职场文书
留学推荐信范文
2014/05/10 职场文书
六查六看自检自查剖析材料
2014/10/14 职场文书
陈斌强事迹观后感
2015/06/17 职场文书
2015大学党建带团建工作总结
2015/07/23 职场文书
2016三严三实专题教育活动心得体会
2016/01/06 职场文书
Redis实现订单自动过期功能的示例代码
2021/05/08 Redis