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视屏资料\day25\video\选课系统讲解4.mp4'))