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程序的循环的运行效率的原因
Apr 01 Python
使用Python写个小监控
Jan 27 Python
Flask框架的学习指南之制作简单blog系统
Nov 20 Python
Python正则表达式匹配中文用法示例
Jan 17 Python
python中使用psutil查看内存占用的情况
Jun 11 Python
python print输出延时,让其立刻输出的方法
Jan 07 Python
python 利用turtle模块画出没有角的方格
Nov 23 Python
python模拟实现斗地主发牌
Jan 07 Python
python-docx文件定位读取过程(尝试替换)
Feb 13 Python
pandas中ix的使用详细讲解
Mar 09 Python
解决TensorFlow程序无限制占用GPU的方法
Jun 30 Python
python 统计代码耗时的几种方法分享
Apr 02 Python
用Python爬虫破解滑动验证码的案例解析
python本地文件服务器实例教程
python字符串常规操作大全
python自动化之如何利用allure生成测试报告
python使用openpyxl库读写Excel表格的方法(增删改查操作)
Python time库的时间时钟处理
Django项目如何获得SSL证书与配置HTTPS
You might like
PHILIPS D1835/D1875的电路分析与打理
2021/03/02 无线电
论坛头像随机变换代码
2006/10/09 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
基于jQuery的图片左右无缝滚动插件
2012/05/23 Javascript
js控制页面控件隐藏显示的两种方法介绍
2013/10/09 Javascript
JavaScript预解析及相关技巧分析
2016/04/21 Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
2017/12/14 Javascript
JS获取input[file]的值并显示在页面的实现方法
2018/03/09 Javascript
layer.open回调获取弹出层参数的实现方法
2019/09/10 Javascript
vue 实现 rem 布局或vw 布局的方法
2019/11/13 Javascript
Vue组件通信$attrs、$listeners实现原理解析
2020/09/03 Javascript
[03:02]2014DOTA2西雅图邀请赛 让队员自己告诉你DK NAVI备战情况
2014/07/08 DOTA
[40:55]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#4Newbee VS Fnatic
2016/03/03 DOTA
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
2017/07/06 Python
Python实现的排列组合计算操作示例
2017/10/13 Python
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
Selenium定位元素操作示例
2018/08/10 Python
Python实用库 PrettyTable 学习笔记
2019/08/06 Python
Tensorflow与Keras自适应使用显存方式
2020/06/22 Python
keras做CNN的训练误差loss的下降操作
2020/06/22 Python
python实现录音功能(可随时停止录音)
2020/10/26 Python
基于django和dropzone.js实现上传文件
2020/11/24 Python
台湾最大银发乐活百货:乐龄网
2018/05/21 全球购物
英国可持续奢侈品包包品牌:Elvis & Kresse
2018/08/05 全球购物
Hawes & Curtis澳大利亚官网:英国经典服饰品牌
2018/10/29 全球购物
Lime Crime官网:美国一家主打梦幻精灵系的彩妆品牌
2019/03/22 全球购物
世界上最受欢迎的花店:1-800-Flowers.com
2020/06/01 全球购物
OnePlus加拿大官网:中国国际化手机品牌
2020/10/13 全球购物
网游商务专员求职信
2013/10/15 职场文书
研究生求职推荐信范文
2013/11/30 职场文书
党支部书记岗位责任制
2014/02/11 职场文书
写给女朋友的检讨书
2015/05/06 职场文书
学生会主席任命书
2015/09/21 职场文书
2016年世界人口日宣传活动总结
2016/04/05 职场文书
python图片灰度化处理的几种方法
2021/06/23 Python