我遇到了这个问题,我一直在寻找并尝试了我能找到的一切,但问题仍然存在。即使密码正确,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
)
''')
我发现了我的问题。
我正在使用不同的哈希系统。在我的旧系统中,我使用的是
hashed_password = stauth.Hasher([password]).generate(),
在使用我的 register() 和 checkpw 使用 bcrypt 将其发送到新系统之前对我的密码进行哈希处理。
所以,我进行了双重哈希,这就是 checkpw 没有返回 True 的原因。验证时它没有正确的哈希值。
因此,在处理此问题时,请首先验证您是否未使用其他函数对您的密码进行哈希处理。
谢谢。