我使用 sqlite3 和 kivy 在 python 中创建了一个登录/注册脚本。创建数据库后,用户可以输入用户名、电子邮件和密码。密码在插入数据库之前会经过哈希处理。注册功能有效,但是我在使用数据库中的用户名和密码验证用户的用户名和密码时遇到错误,其中代码在用户名/密码错误后输出“登录成功”。
def login_menu_press(self):
login = False
lusername = self.login_username.text
lpassword = self.login_password.text
print(f"Your username is {lusername}, and your password is {lpassword}.")
self.login_username.text = ""
self.login_password.text = ""
# Hashing inputted password
context = CryptContext(
schemes=["pbkdf2_sha256"],
default="pbkdf2_sha256",
# More rounds = more secure, but slower to hash
pbkdf2_sha256__default_rounds=50000
)
# Hash the inputted password
hash_pass = context.hash(lpassword)
# Connect to database
conn = sqlite3.connect('users.db')
# Create cursor
c = conn.cursor()
# Query database
command = f"SELECT * from users WHERE username='{lusername}' AND Password = '{hash_pass}';"
c.execute(command)
if not c.fetchone():
print("Login successful")
login = True
else:
print("Login failed")
我相信查询数据库注释后错误仍然存在,感谢任何帮助,谢谢!
我期望当用户名和密码正确时登录成功输出,这是正确的。但是,当用户名和密码是随机的时,代码会再次输出此内容。
编辑:用户输入的密码使用与用户注册密码相同的算法进行哈希处理,因此哈希值将相同。
您使用的哈希算法使用盐,因此对于完全相同的输入字符串,它将输出不同的哈希值:
# Hash the inputted password
lpassword = "Rambo"
hash_pass = context.hash(lpassword)
print(hash_pass)
hash_pass = context.hash(lpassword)
print(hash_pass)
hash_pass = context.hash(lpassword)
print(hash_pass)
$pbkdf2-sha256$50000$wniP0br3XguBsJbSuvc.xw$vmebKLd0Uvz4IF7DbX/TzCgD5p1/cmPYApaf2eKeZ4w
$pbkdf2-sha256$50000$wJjT2tv7H8NY633vXYvROg$D0CxPTfO8jIaLPHvUtawhzKMX75LqDYSNa.z3Bf/58s
$pbkdf2-sha256$50000$tZbSWmvNmdPau9eas1ZKaQ$qMVGQWPtlLvFZ/WlG.iDO7.jIHhFiirMZw0gysfqXhs
因此无法匹配之前插入和散列的密码值。您必须使用哈希函数,它总是为相同的输入字符串生成相同的值,例如 SHA-256。替换:
hash_pass = context.hash(lpassword)
与:
import hashlib # on top of main.py
hash_pass = hashlib.sha256(lpassword.encode()).hexdigest()
并注释掉这部分代码:
context = CryptContext(
schemes=["pbkdf2_sha256"],
default="pbkdf2_sha256",
# More rounds = more secure, but slower to hash
pbkdf2_sha256__default_rounds=50000
)
你也必须改变你的状况:
if not c.fetchone():
改为if c.fetchone():