使用 sqlite3 在 python 中登录/注册脚本

问题描述 投票:0回答:1

我使用 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")

我相信查询数据库注释后错误仍然存在,感谢任何帮助,谢谢!

我期望当用户名和密码正确时登录成功输出,这是正确的。但是,当用户名和密码是随机的时,代码会再次输出此内容。

编辑:用户输入的密码使用与用户注册密码相同的算法进行哈希处理,因此哈希值将相同。

python sql sqlite
1个回答
0
投票

您使用的哈希算法使用盐,因此对于完全相同的输入字符串,它将输出不同的哈希值:

    # 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():

© www.soinside.com 2019 - 2024. All rights reserved.