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