11-19 hashlib模块
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
什么是摘要算法呢?
摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。
摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。
sha 算法 随着算法复制程度成都的增加,摘要的时间和成本空间都会增加
摘要算法的作用
1、密码的密文存储
2、文件的一致性验证
在下载的时候,检查我们下载的文件和远程服务器上的文件是否一致
两台机器上的两个文件,你想检查这两个文件是否相等
摘要算法:包括一堆算法 import hashlib #提供摘要算法的模块 md5 = hashlib.md5() #使用了md5算法 md5 = hashlib.sha1() #使用了sha1算法 md5.update(b'alex3714') #aee949757a2e698417463d47acac93df print(md5.hexdigest()) 说明: 不管算法多么不同,摘要的功能始终不变 对于相同的字符串,使用同一个算法进行摘要,得到的值总是不变的 对于相同的字符串,使用不同的算法进行摘要,得到的值应该不同 不管使用什么算法,hashlib的方式永远不变
做摘要计算,实质就是把字节类型的内容进行摘要处理
MD5方式:正常md5、加盐的、动态加盐的
例子:
#用户登录-----(用\n作为分隔符,容易出错,因为下面是以line来遍历的) import hashlib usename = input('输入名字:') password = input('输入密码:') md5 = hashlib.md5() #生成加密串,其中 password 是要加密的字符串 md5.update(b'password') #获取加密串 get_psd = md5.hexdigest() with open('userinfo','w') as f: f.write(usename+'|') f.write(get_psd) f.close() #用户登录 import hashlib usename = input('输入名字:') password = input('输入密码:') md5 = hashlib.md5() #生成加密串,其中 password 是要加密的字符串 md5.update(b'password') #获取加密串 getnew_psd = md5.hexdigest() print(getnew_psd) with open('userinfo') as f: for line in f: user,psd = line.split('|') if usename ==user and getnew_psd == psd: print('登录成功!') else: print('登录失败!') exit() f.close()
摘要算法中加盐
import hashlib #提供摘要算法的模块 md5 = hashlib.md5(bytes('salt',encoding='utf-8')) #使用了md5算法 md5.update(b'alex3714') #aee949757a2e698417463d47acac93df print(md5.hexdigest()) #29520817dd17b99ea7af32890f7698fb(和不加盐的结果不一样)
动态加盐
使用用户的一部分或者直接使用使用整个用户名作为盐 import hashlib #提供摘要算法的模块 md5 = hashlib.md5(bytes('盐',encoding='utf-8')+b'123') #使用了md5算法 md5.update(b'alex3714') print(md5.hexdigest()) #28236e01d84bd2ecc7642c4e9b811845(结果不一样)
import hashlib md5 = hashlib.md5() md5.update('alex') md5.update('3714') print(md5.hexdigest)#得到的结果与不分开的一致,所以以后可以对字符串或者文件分开update