我在尝试登录我正在开发的 Flask 应用程序时遇到问题,该应用程序使用 bcrypt 身份验证将加密密码存储在 PostgreSQL 数据库中。
尝试使用有效凭据登录时,我收到以下错误: { “错误”:“无效的盐”}
但是,检查数据库后,用户数据似乎是正确的:
id=3
用户名=therock
密码=\x2432622431322447427839364969554c4a394a61334266536646777365616938546f323066722e78716468485276367165677537687a43596 5427975
以下是相关代码片段:
# Login code snippet
@user_bp.route('/login', methods=['POST'])
def login():
data = request.get_json()
username = data.get('username')
password = data.get('password')
try:
conn = connect_db()
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE username=%s", (username,))
user = cursor.fetchone()
if user:
hashed_password = user[3]
if bcrypt.checkpw(password.encode(), hashed_password.encode()):
else:
return jsonify({'error': 'Invalid password!'}), 401
else:
return jsonify({'error': 'Invalid username!'}), 401
except Exception as e:
return jsonify({'error': str(e)}), 500
finally:
if 'conn' in locals():
conn.close()
有人可以帮助我理解为什么我在尝试登录时收到此“无效盐”错误,即使数据库中的凭据似乎是正确的?
24...75
是十六进制编码的哈希值。如果这个值是十六进制解码的,你会得到:
$2b$12$GBx96IiULJ9Ja3BfSfFwseai8To20fr.xqdhHRv6qegu7hzCYeByu
如果使用
checkpw()
对照此哈希检查密码,则验证成功(即返回 True
):
import bcrypt
hash = bytes.fromhex('2432622431322447427839364969554c4a394a61334266536646777365616938546f323066722e78716468485276367165677537687a435965427975')
print(hash.decode('utf-8')) # $2b$12$GBx96IiULJ9Ja3BfSfFwseai8To20fr.xqdhHRv6qegu7hzCYeByu
verified = bcrypt.checkpw('senha7894'.encode('utf-8'), hash)
print(verified) # True