33.hashlib摘要算法(数据加密)
摘要算法
摘要算法的作用:
使用摘要算法对用户的密码进行加密,将密码变成一串毫无规律的字符串,只要是两串密码有丝毫不同,生成的字符串就也会不同,对相同的数据转换后结果永远相同。
转换的方法和步骤:
import hashlib md5=hashlib.md5() #选择转换的算法 md5.update(b'hello world') #想要转换的数据必须为bytes print(md5.hexdigest()) #打印出加密后的密文
执行结果:
5eb63bbbe01eeed093cb22bb8f5acdc3
md5是一种主流的摘要算法,在转换时,不管算法多么不同,摘要的功能始终不变
对于相同的字符串使用同一个算法进行摘要,得到的值总是不变的;使用不同的算法对相同的字符串进行摘要,得到的值应该不同,不同算法的摘要使用方法是相同的
如下使用sha算法进行摘要,sha算法随着算法的复杂读增加,摘要时的时间成本和内存成本都在增加
sha=hashlib.sha1() sha.update(b'hello world') print(sha.hexdigest())
执行结果:
2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
如下是一段md5登录验证密码:
能够将用户输入的密码转换成加密数据存储起来,使存储代码的文件也无法看出数据的具体内容,同时,摘要算法只能将数据加密,却无法将数据逆转换成源格式。
import hashlib def zhu(): username=input('输入用户名:') pwd=input('输入密码:') md5=hashlib.md5(bytes(pwd,encoding='utf-8')) md5_pwd=md5.hexdigest() be_writed=username+'|'+md5_pwd with open('write.txt','w+') as f: f.write(be_writed) def logion(): username = input('输入用户名:') pwd = input('输入密码:') md5 = hashlib.md5(bytes(pwd, encoding='utf-8')) md5_pwd = md5.hexdigest() with open('write.txt') as f: for i in f: user,pwd=i.split('|') if username==user and md5_pwd==pwd: print('登录成功') zhu() logion()
加盐:
md5原理上是不可逆转的,不能破解出其源码,随着技术进步,可以使用撞库来破解出一段摘要的原码
为了提高密码的安全性,可以给密码加盐
import hashlib md5=hashlib.md5(bytes('salt',encoding='utf-8')) #给密码加盐,,必须为bytes类型 md5.update(b'hello world') #想要转换的数据必须为bytes print(md5.hexdigest())
动态加盐
使用用户名的一部分或者使用整个用户名作为盐
import hashlib md5=hashlib.md5(bytes('salt',encoding='utf-8')+byte(name,encoding='utf-8')) #给密码加盐,,必须为bytes类型 md5.update(b'hello world') #想要转换的数据必须为bytes print(md5.hexdigest())
摘要算法的应用场景:
密码的密文存储,
文件的一致性验证
在下载的时候,检查我们下载的文件和远程服务器上的文件是否相等
检查两台机器上的文件是否相等
文件的一致性校验时,不需要加盐操作
分开摘要和整个摘要:
有时要加密的数据无法同时输入,就无法将整个数据加密。
但是同一个数据,整个摘要和分开摘要的最终结果是相同的,因此对一个文章进行摘要时,可以将文章分成多个部分摘要
import hashlib md5=hashlib.md5() md5.update(b'123') md5.update(b'456') print(md5.hexdigest())) #返回的使b'123456'加密后的数据
执行结果:
e10adc3949ba59abbe56e057f20f883e

浙公网安备 33010602011771号