鱼C论坛

 找回密码
 立即注册
查看: 1789|回复: 5

[已解决]在登录时,我输入正确密码会给我弹出密码错误

[复制链接]
发表于 2023-8-15 14:33:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码求助
在登录时,我输入正确密码会给我弹出密码错误
百思不得其解
我寻思我代码也没毛病啊
求大佬帮助
"""【注册】和【登陆】的代码"""

#准备工作
import hashlib
content = {}

#定义四个函数分别用于获取用户指令(get_int())、注册(register())、登陆(login())、MD5加密(encrypt())
#获取用户指令(get_int())
def get_int():
    command = input("请输入指令:")
    print("====================")
    return int(command)

#注册(register())
def register():
    name = input("请输入用户名:")
    password_input = input("请输入密码:")
    encrypted_password = encrypt(password_input)
    content[name] = encrypted_password
    print("恭喜,注册成功~")
    print("====================")

#MD5加密(encrypt())
def encrypt(password):
    encrypted_password = hashlib.md5(password.encode())
    return encrypted_password
      
#登陆(login())
def login():
    while True:
        name = input("请输入用户名:")
        if name not in content:
            print("该用户名不存在。")
        else:
            break
    while True:
        password_test = input("请输入密码:")
        encrypted_password = encrypt(password_test)
        if content[name] != encrypted_password:
            print("密码错误!")
        else:
            print("恭喜,登录成功~")
            break
    print("====================")    
        
#开始运行    
print("欢迎来到鱼C论坛~")
print("====================")
print("""1. 注册
2. 登陆
3. 退出""")
while True:
    command = get_int()
    if command  == 1:
        register()
    elif command == 2:
        login()
    elif command == 3:
        break
谢谢

最佳答案
2023-8-15 14:46:58
md5要调用hexdigest获取密文,否则返回的只是一个md5 HASH对象,而加密同一串字符串返回的对象是不同的
>>> import hashlib
>>> a = hashlib.md5(b'a')
>>> b = hashlib.md5(b'a')
>>> a == b
False
将encrypt修改为:
def encrypt(password):
    encrypted_password = hashlib.md5(password.encode()).hexdigest()
    return encrypted_password
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-15 14:34:01 | 显示全部楼层
问题出在登录函数中的密码比对部分。在每次比对密码时,都会重新对输入的密码进行MD5加密,然后与注册时保存的加密密码进行比对。这样会导致每次比对的结果都不相等,即使输入的密码是正确的。解决方法是在登录函数中,只对输入的密码进行一次MD5加密,然后与注册时保存的加密密码进行比对。

以下是修改后的代码:
# 登陆(login())
def login():
    while True:
        name = input("请输入用户名:")
        if name not in content:
            print("该用户名不存在。")
        else:
            break
    while True:
        password_test = input("请输入密码:")
        encrypted_password = encrypt(password_test)
        if content[name] != encrypted_password:
            print("密码错误!")
        else:
            print("恭喜,登录成功~")
            break
    print("====================")

在这个版本的代码中,只在输入密码后进行一次MD5加密,然后与注册时保存的加密密码进行比对。这样就可以正确地判断密码是否正确了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-15 14:36:37 | 显示全部楼层
isdkz 发表于 2023-8-15 14:34
问题出在登录函数中的密码比对部分。在每次比对密码时,都会重新对输入的密码进行MD5加密,然后与注册时保 ...

我寻思你也没有改我的代码啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-15 14:46:58 | 显示全部楼层    本楼为最佳答案   
md5要调用hexdigest获取密文,否则返回的只是一个md5 HASH对象,而加密同一串字符串返回的对象是不同的
>>> import hashlib
>>> a = hashlib.md5(b'a')
>>> b = hashlib.md5(b'a')
>>> a == b
False
将encrypt修改为:
def encrypt(password):
    encrypted_password = hashlib.md5(password.encode()).hexdigest()
    return encrypted_password

评分

参与人数 1贡献 +3 收起 理由
歌者文明清理员 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-15 14:48:16 | 显示全部楼层
鱼cpython学习者 发表于 2023-8-15 14:46
md5要调用hexdigest获取密文,否则返回的只是一个md5 HASH对象,而加密同一串字符串返回的对象是不同的

...

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-15 14:54:08 | 显示全部楼层
鱼cpython学习者 发表于 2023-8-15 14:46
md5要调用hexdigest获取密文,否则返回的只是一个md5 HASH对象,而加密同一串字符串返回的对象是不同的

...

感谢哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 19:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表