hashlib模块的本质:
1、内部有算法的模块
2、内部不止一种算法
hashlib模块的作用:
1、由于数据的不安全性,为了保证用户的信息绝对的安全,所以所有人的密码都不可以
2、明文的形式存储,而应该经过适当的处理以密文的形式存起来
hashlib模块的作用:
1、大家去计算这个密文 使用的是相同的算法
2、这个算法不可逆
3、不同的字符串通过这个算法的计算得到的密文总是不同的
4、相同的算法 相同的字符串 获得的结果总是相同的
5、不同的语言 不同的环境(操作系统、版本、时间)
hashlib的基本用法
import hashlib md5_obj = hashlib.md5() # 选择不同的哈希算法(不同系列) md5_obj.update('666'.encode('utf-8')) # update只接受字节。(b'you911230'或者.encode('utf-8')) ret = md5_obj.hexdigest() # hex十六进制,digest消化 print(ret)
结果为:
699bb2b220096188a700ac5129dda46f # md5为32位的十六进制的密文
加入哈希算法的登录程序
import hashlib def get_md5(s): md5_obj = hashlib.md5() md5_obj.update(s.encode('utf-8')) ret = md5_obj.hexdigest() return ret name = input('name>>>') pwd = input('password>>>') with open('userinfor') as f: # str for line in f: user,paswd = line.strip().split('|') if name == user and get_md5(pwd) == paswd: # hashlib之后再存储、比较 print('登陆成功') break else: print('登录失败')
注意:1、文件操作:f.readlines()浪费内存
2、md5不能重复使用
hashlib 摘要算法
多种算法
md5算法 :32位16进制的数字字符组成的字符串
应用最广大的摘要算法
效率高,相对不复杂,如果只是传统摘要不安全
sha算法 :40位的16进制的数字字符组成的字符串
sha算法要比md5算法更复杂
且shan n的数字越大算法越复杂,耗时越久,结果越长,越安全
sha_obj = hashlib.sha1() sha_obj.update('alex3714'.encode('utf-8')) ret = sha_obj.hexdigest() print(len(ret)) # 40
动态加盐
import hashlib def get_md5(user,s): md5_obj = hashlib.md5(user.encode('utf-8')) # 用户名作为盐 md5_obj.update(s.encode('utf-8')) ret = md5_obj.hexdigest() return ret print(get_md5('alex', 'alex3714')) # ee838c58e5bb3c9e687065edd0ec454f print(get_md5('wuser', '666')) # 2193ed3002d63fea40ddfcc0178cb8fe print(get_md5('zhangsan ', '666')) # d3f40c7661e1d28d3df38aa1f5c85029
文件的一致校验
给一个文件中的所有内容进行摘要算法得到一个md5的结果
import hashlib def get_file_md5(file_path): md5_obj = hashlib.md5() # md5不能重复使用 with open(file_path,encoding='utf-8') as f: for line in f: md5_obj.update(line.encode('utf-8')) # update可以叠加 ret = md5_obj.hexdigest() print(ret) get_file_md5('D:骑士计划第五周Day25课堂代码.py')
视频文件的校验
1、以rb的形式来读,读出来的是bytes
2、并且不能按行读,也不能一次性读出来
3、getsize()-->字节大小
import os import hashlib def get_file_md5(file_path,buffer = 1024): md5_odj = hashlib.md5() file_size = os.path.getsize(file_path) with open(file_path,'rb') as f: while file_size: content = f.read(buffer) # 读1024个bytes类型的字节 file_size -= len(content) md5_odj.update(content) return md5_odj.hexdigest() print(get_file_md5(r'D:Python视屏资料day25video选课系统讲解4.mp4'))