常用模块--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())

作业:对一个文件进行摘要算法,要求分段摘要,进阶操作:按字节分段摘要

 

posted on 2019-04-23 17:06  Jerry-Wang  阅读(161)  评论(0)    收藏  举报