Python使用SQL-Connector与Bcrypt时,如何获取数据库中纯哈希字符串?
解决SQL查询结果提取纯哈希字符串的问题
嘿,这个场景我太熟悉了!你拿到的[('$2b$12$rRkfWn03an8WxtfRSMNd2ebbPrhpbkRONzsAdCmM/goV9XobpOYk6',)]其实是SQL查询返回的结果集结构——外层是包含所有匹配行的列表,每一行数据又以元组的形式存储,而你要的哈希字符串就是这个元组里的第一个(也是唯一一个)元素。
咱们直接看怎么提取:
1. 理解查询结果的结构
假设你执行查询的代码是类似这样的:
cursor.execute("SELECT password_hash FROM users WHERE username = %s", (input_username,)) result = cursor.fetchall()
这里的fetchall()会返回所有符合条件的行,每一行是一个元组(对应你查询的列数,这里只查了password_hash一列,所以元组里只有一个元素)。
2. 提取纯哈希字符串
方法一:用fetchall()时提取
如果确定只会返回一行数据(比如用户名是唯一的),直接通过索引取到目标字符串:
# 先判断结果不为空(避免用户不存在时索引报错) if result: # 取列表的第一个元素(即唯一的行),再取元组的第一个元素(即哈希字符串) pure_hash = result[0][0]
方法二:用fetchone()更简洁
因为你是按用户名查询单个用户,用fetchone()会直接返回匹配的第一行(是一个元组),不用再处理外层列表:
result = cursor.fetchone() if result: # 直接取元组的第一个元素 pure_hash = result[0]
3. 完整的密码验证示例
把提取和bcrypt验证结合起来,完整代码大概是这样:
import bcrypt import mysql.connector # 初始化数据库连接(根据你的配置修改) db_conn = mysql.connector.connect( host="your_host", user="your_user", password="your_db_password", database="your_db_name" ) cursor = db_conn.cursor() # 获取用户输入 input_username = input("请输入用户名:") input_password = input("请输入密码:").encode('utf-8') # bcrypt需要字节串 # 查询存储的哈希 cursor.execute("SELECT password_hash FROM users WHERE username = %s", (input_username,)) result = cursor.fetchone() if result: # 提取纯哈希并转成字节串 stored_hash = result[0].encode('utf-8') # 用bcrypt验证 if bcrypt.checkpw(input_password, stored_hash): print("密码验证通过!") else: print("密码错误!") else: print("该用户不存在!") # 关闭资源 cursor.close() db_conn.close()
关键提醒
- 一定要先判断
result不为空,否则当用户不存在时,result[0]会抛出索引越界错误。 - bcrypt的
checkpw方法要求两个参数都是字节串,所以要把数据库取出的字符串(默认是str类型)和用户输入的密码都转成字节串(用.encode('utf-8'))。
内容的提问来源于stack exchange,提问作者KIANick
相关产品推荐
相关产品推荐

