常用模块--hashlib
hashlib---摘要算法
# 摘要算法 # 使用摘要算法的时候,传入的参数必须是bytes数据类型; # 如果摘要的数据不变,无论摘要多少次,产生的摘要结果都是一样的。 # 两个字符串:假如有500W个字符,只要其中一个字符不一样,通过摘要算法后,拿到的摘要都不一样
格式
# 格式: import hashlib 变量名 = hashlib.算法() # 定义算法类型 变量名.update(b'字符串') # 开始摘要算法 print(变量名.hexdigest()) # 打印产生的值
注意事项
# 不管算法多么不同,摘要的功能始终不变 # 对于相同的字符串使用同一个算法进行摘要,得到的值总是不变的 # 使用不同算法对相同的字符串进行摘要,得到的值应该不同 # 不管使用什么算法,hashlib的方式永远不变
例子
import hashlib # 提供摘要算法的模块 md5 = hashlib.md5() # 常用MD5算法, md5.update(b'123') # 开始进行摘要算法 print(md5.hexdigest()) # 拿到摘要算法后的值
常用场景
# 摘要算法常用场景 # 密码的密文存储 # 文件的一致性验证 (因为摘要算法对相同的东西执行算法后,产生的值都是不变得,如果两个值对不上,证明文件不一致) # 在下载的时候,检查我们下载的文件和远程服务器上的文件是否一致 # 两台机器上的两个文件,你想检查这两个文件是否相等
例子
# 先建立一个userinfo的文件 import hashlib # 导入hashlib class Files(): # 创建类,用于操作文档 def write_file(self,user,pwd): # 定义方法文件写入 self.user = user self.pwd =pwd with open('userinfo','w+',encoding='utf-8') as f: f.write('%s|%s'%(self.user,self.pwd)) def read_file(self,filename): # 定义方法文件读取 self.filename = filename with open(self.filename,'r+',encoding='utf-8') as f: for line in f: l = line.strip().split('|') return l def hashlib_pwd(pwd): # 定义函数 进行摘要算法 md5 = hashlib.md5() md5.update(bytes(pwd,encoding='utf-8')) ret = md5.hexdigest() return ret def check_info(user): # 定义函数 验证用户名密码 file = Files() l = file.read_file('userinfo') F = True while F: if user == l[0]: pwd = input('请输入密码:') if hashlib_pwd(pwd) ==l[1]: print('验证通过') F =False else: print('密码错误') else: print('用户名错误!') user = input('请输入用户名') file = Files() # 实例化文件类 print(''' -----用户注册----- ''') username = input('请输入用户名:') password = input('请输入密 码:') write_info = file.write_file(username,hashlib_pwd(password)) print(''' -----注册成功----- -----接着验证----- ''') user = input('请输入用户名') check_info(user)
摘要算法进阶:
# 给算法加盐:给bytes数据类型里的字符串加入其它的字符或字符串(盐)
格式
import hashlib 变量名 = hashlib.md5(bytes(str,enconding='utf-8)) # 给算法加盐 变量名.update(b'字符串') # 开始摘要算法 print(变量名.hexdigest()) # 打印产生的值
例子
import hashlib # 提供摘要算法的模块 md5 = hashlib.md5() # 常用MD5算法, md5.update(b'jerry123') # 开始进行摘要算法 print(md5.hexdigest()) # 拿到摘要算法后的值 md5 = hashlib.md5(bytes('salt',encoding='utf-8')) # 加盐了的算法 ,'salf'字符串可以任意设置 md5.update(b'jerry123') # 开始进行摘要算法 print(md5.hexdigest()) # 拿到摘要算法后的值
再进阶
# 动态加盐 # 用户名 密码 # 使用用户名的一部分或者直接使用整个用户名为盐
例子
# pwd = input('请输入密码:') # md5 = hashlib.md5(bytes('盐',encoding='utf-8')+bytes('%s'%pwd[1:3:1],encoding='utf-8')) # md5.update(bytes(pwd,encoding='utf-8')) # 开始进行摘要算法 # print(md5.hexdigest()) # 拿到摘要算法后的值
注意事项
# 文件的一致性 # 在文件的一致性校验的时候不需要加盐,因为加了盐,别人不知道你的盐是什么
再加注意
update()可以多次使用 #常用于读取文件 # 多次update后的值和一次update的值是一样的 # 如果文件很大就采用多次update
例子
import hashlib # 提供摘要算法的模块 md5 = hashlib.md5() # 常用MD5算法, md5.update(b'jerry123') # 开始进行摘要算法 print(md5.hexdigest()) # 拿到摘要算法后的值 md5 = hashlib.md5() md5.update(b'jerry') # 将jerry123分段读取 md5.update(b'123') print(md5.hexdigest())
作业:对一个文件进行摘要算法,要求分段摘要,进阶操作:按字节分段摘要
浙公网安备 33010602011771号