bcrypt.checkpw 未按预期工作

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

我遇到了这个问题,我一直在寻找并尝试了我能找到的一切,但问题仍然存在。即使密码正确,bcrypt.checkpw 也会返回 false。在我的数据库中,我有这个哈希密码:

$2b$14$pQOcw.eOoood3v7svmIZt.3lhBjyHYfCoJB4jbaRqPGQvwI4iosGG
密码是“test101”。

如果我在同一个函数中进行散列和校验密码,它就可以工作。但是当我将两者分开时,在寄存器中进行哈希处理,在登录中进行检查密码。那么,无论我做什么,我都无法让它返回 True。密码与散列中使用的密码相同。数据库已正确存储记录。

这是在 checkpw 函数上使用的内容,按正确的顺序:

hashed_password
<class 'bytes'>
b'$2b$14$pQOcw.eOoood3v7svmIZt.3lhBjyHYfCoJB4jbaRqPGQvwI4iosGG'
b'test101'

这里是注册和登录功能,我使用streamlit作为UI,使用SQLite3作为数据库:

# Función de registrar
def register(database, nombre, password, email, matricula):
    try:
        conn = database.connect()
        cursor = conn.cursor()

        query = "INSERT INTO student (nombre, password, email, matricula, created_at, active) VALUES (?, ?, ?, ?, ?, ?)"
        cursor.execute(query, (nombre,
                               bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt(14)),
                               email,
                               matricula,
                               datetime.now(),
                               True))
        conn.commit()

    except Exception as e:
        print(f"Error: {e}")
        return False

    finally:
        conn.close()

    return True


# Función de login
def login(database, email, password):
    try:
        conn = database.connect()
        cursor = conn.cursor()

        query = "SELECT password FROM student WHERE email = ?"
        cursor.execute(query, (email,))

        hashed_password = cursor.fetchone()

        if hashed_password:
            print("hashed_password")
            print(type(hashed_password[0]))  # Debería imprimir <class 'bytes'>
            print(hashed_password[0])  # Debería imprimir el hash en formato bytes
            print(password.encode('utf-8'))  # Debería imprimir el hash en formato bytes
            if bcrypt.checkpw(password.encode('utf-8'), hashed_password[0]):
                return True

    except Exception as e:
        print(f"Error: {e}")

    finally:
        conn.close()

    return False

这是这张表:

 cursor.execute('''
            CREATE TABLE IF NOT EXISTS student (
                id INTEGER PRIMARY KEY,
                email TEXT NOT NULL UNIQUE,
                matricula INTEGER NOT NULL UNIQUE,
                nombre TEXT NOT NULL,
                password TEXT NOT NULL,
                created_at DATETIME NOT NULL,
                active BOOLEAN NOT NULL,
                is_admin BOOLEAN NULLABLE              
            )
        ''')
python bcrypt streamlit
1个回答
0
投票

我发现了我的问题。

我正在使用不同的哈希系统。在我的旧系统中,我使用的是

hashed_password = stauth.Hasher([password]).generate(),

在使用我的 register() 和 checkpw 使用 bcrypt 将其发送到新系统之前对我的密码进行哈希处理。

所以,我进行了双重哈希,这就是 checkpw 没有返回 True 的原因。验证时它没有正确的哈希值。

因此,在处理此问题时,请首先验证您是否未使用其他函数对您的密码进行哈希处理。

谢谢。

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