您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:Python基础之hashlib模块详解

51自学网 2021-10-30 22:41:41
  python
这篇教程Python基础之hashlib模块详解写得很实用,希望能帮到您。

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

2)obj是hash对象

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

3)得到字符串

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

4)给加密增添难度

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

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

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

四、小小案例

import hashlibUSER_LIST = []def get_md5(data):    obj = hashlib.md5("12:;idrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad".encode('utf-8'))    obj.update(data.encode('utf-8'))    result = obj.hexdigest()    return resultdef 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 Trueregister()result = login()if result:    print('登陆成功')else:    print('登陆失败')------------------------结果:**************用户注册**************请输入用户名:小马过河请输入密码:123456请输入用户名:N**************用户登陆**************请输入用户名:小马过河请输入密码:123456登陆成功

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


用Python爬虫破解滑动验证码的案例解析
Python中常见的导入方式总结
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。