python基础-hashlib模块

hashlib 模块

用于对数据加密的模块。重点学习MD5即可。

md5:是一种不可解密的摘要算法。也就是某个内容中获取的加密字符串。密文密码就是一个摘要。

注意:摘要一样,内容就一定一样。保证了唯一性

现在就md5摘要算法为例,演示加密过程,上代码!

import hashlib
def str_md5(text):
    # 获取一个md5对象
    md5_obj = hashlib.md5()
    # 通过md5_obj的update()进行哈希排序,update只能接收bytes
    md5_obj.update(text.encode("utf-8"))
    # 通过hexdigest 获取一个加密摘要信息
    res = md5_obj.hexdigest()
    print(res)

当文本过长时,可以将文本截取拆分,多次执行update方法,最后执行hexdigest,这样得到的摘要信息也就是一样的。这也就验证了摘要一样,内容就一定一样,那么在实际应用中,我们可以设定一些固定的文本或者数字密码的摘要信息去一一匹配数据库中的记录。这个过程就是“撞库”,那我们该如何避免此类问题呢?

为了确保别人不能通过那些常用值来推测密文密码,我们通常会加一些复杂的口令跟要加密的文本一起加密,这个过程称为加盐

我们依据上面的👆代码重新整理下

import hashlib
def str_md5(text):
    # 获取一个md5对象
    md5_obj = hashlib.md5()
    # 通过md5_obj的update()进行哈希排序,update只能接收bytes
    md5_obj.update(text.encode("utf-8"))
    # 设置一个复杂的口令,这个口令就是“盐”
    str_code = "今天的风超级凶,都能把我吹走了!!!!"
    md5_obj.update(text.encode("utf-8"))
    """
    这个额外增加了口令,然后重新通过update进行哈希排序的过程,就是加盐
    """
    # 通过hexdigest 获取一个加密摘要信息
    res = md5_obj.hexdigest()
    print(res)

需求:我们一起来模拟个用户注册登录的过程,(使用md5加密的方式存储密码)

"""
1.注册一个用户,密码使用md5加密,保存在文本文件中
2.用户登录,将用户输入的账号密码,一一和文本文件中的记录比较
注意:用户输入的密码需要加密后再跟文本文件中的比较
"""
import hashlib
import os


def pwd_md5(pwd):
    """
    给文本进行加密
    :param pwd: 用户输入的密码
    :return: 加密摘要信息
    """
    md5_obj = hashlib.md5()
    # update() 只能接收bytes类型数据
    md5_obj.update(pwd.encode("utf-8"))
    # 解决撞库问题,加盐
    str_code = "有些事情不是努力就可以得到期望的结果。失之我命,得之我幸!"
    md5_obj.update(str_code.encode("utf-8"))
    # 获取一个摘要字符串
    password = md5_obj.hexdigest()
    return password


def register():
    """
    注册功能
    将密码加密后,和用户名一起存在文本文件中
    :return:
    """
    name_inp = input("请输入用户名:")
    pwd_inp = input("请输入密码:")
    # 调用pwd_md5 加密
    password = pwd_md5(pwd_inp)
    # 保存用户信息
    with open(f"{name_inp}.txt", "w", encoding="utf-8") as f:
        f.write(f"{name_inp}|{password}")


def login():
    """
    登录功能
    根据用户输入的用户名判断用户是否存在
    存在的话,将用户和密码跟文本中的记录进行比对,比对成功,即登录成功。比对失败,即登录失败
    不存在,提示用户不存在
    :return:
    """
    name_inp = input("请输入用户名:")
    pwd_inp = input("请输入密码:")
    if os.path.exists(f"{name_inp}.txt"):
        with open(f"{name_inp}.txt", "r", encoding="utf-8") as f:
            userinfo = f.read()
            username = userinfo.split("|")[0]
            password = userinfo.split("|")[1]
        if name_inp == username and pwd_md5(pwd_inp) == password:
            print("登录成功!")
        else:
            print("登录失败!")
    else:
        print("该用户不存在!")


func_dict = {
    "1": register,
    "2": login,
    "3": "exit"
}


def main():
    while True:
        print("欢迎使用注册登录系统".center(60, "-"))
        print("""
            1. 注册
            2. 登录
            3. 退出
            
        """)
        choice = input("请输入操作编号:")
        if not choice.isdigit():
            print("编号必须是数字!")
            continue
        if int(choice) not in (range(len(func_dict))):
            print("操作编号不在范围内!")
            continue
        if choice == "3":
            break
        else:
            func_dict[choice]()


main()
posted @ 2019-11-18 17:01  格桑_哈哈  阅读(128)  评论(0编辑  收藏  举报