在Python/SQLite3中,如何定义用于查询数据库表的变量?

在Python/SQLite3中,如何定义用于查询数据库表的变量?,python,flask,sqlite,bcrypt,Python,Flask,Sqlite,Bcrypt,我有一张三列的桌子 id username password ---------------------- 1 Jdoe $2a$12$sv97wrhscHkKVMZ8P/2yw.O/cz8pWUE/1zlTyFNJ9.jCYhR8Nw9Iu 2 user $2a$12$dLeSlYFyPdP1WhA4Tw21ZuX5v5XH55.yK2XApMd4VglUDRJEd4Lmy 我的目标是根据登录时提供的密码对用户进行身份验证。为了实现这一点,我编写了

我有一张三列的桌子

  id  username  password
  ----------------------
  1  Jdoe      $2a$12$sv97wrhscHkKVMZ8P/2yw.O/cz8pWUE/1zlTyFNJ9.jCYhR8Nw9Iu
  2  user      $2a$12$dLeSlYFyPdP1WhA4Tw21ZuX5v5XH55.yK2XApMd4VglUDRJEd4Lmy
我的目标是根据登录时提供的密码对用户进行身份验证。为了实现这一点,我编写了如下Python代码:

from bcrypt import hashpw, gensalt


if request.method == 'POST':
      if form.validate() == False:

         return render_template('login.html', form = form)
      else:
         #return render_template('index.html')
         password = request.form['password']
         password = hashpw(password, gensalt())
         con = sql.connect("testDB.db")
         cur = con.cursor()
         cur.execute("SELECT * FROM mytable where password =?", (password,))

         if cur.fetchall():
              return "welcome guest"
         else:
              return "user not found"
但是,当我输入现有密码时,系统返回消息user not found。所需的输出用于消息Welcome guest。hashpw和gensalt是从bcrypt导入的

我很确定我错误地定义了变量密码。如何正确定义这样一个变量?

您正在生成一个新的哈希,一个具有完全不同的salt的哈希:

password = hashpw(password, gensalt())
您不能通过密码查找用户;使用salt散列的全部目的是让黑客不可能使用rainbow表进行散列,但没有salt来匹配散列。同样的保护使您不可能预先知道给定用户使用了什么salt,并且您几乎可以保证生成与新salt不同的散列

您需要使用用户名立即查找,检索salt密码,然后要求bcrypt.checkpw函数根据存储的哈希安全地测试密码。散列值包括salt,bcrypt将提取salt并使用它来验证是否生成了相同的散列。比较需要防止定时攻击,不要自己重新执行此检查

您的表单需要发送用户名,而不仅仅是密码:

from bcrypt import checkpw


username = request.form['username']
password = request.form['password']
con = sql.connect("testDB.db")
cur = con.cursor()
cur.execute("SELECT password FROM mytable where username = ?", (username,))
hashed = cur.fetchone()
if hashed is None or not checkpw(password, hashed[0]):
    # no such user, *or* the password did not match
    return "user not found"

# password matched the hashed value from the database
return "welcome guest"

乍一看,您的密码列看起来太窄了。我不知道您在这里使用的是什么散列函数,但大多数密码散列会产生更长的散列。用哈希值纵向检查列宽hashpw来自哪里?您确定它生成的输出与数据库列信息匹配吗?而且,你正在生产一种新的盐,这几乎肯定是错误的。通常,您会将用户名与数据库匹配,检索散列密码,并将其与明文输入的密码一起传递给另一个函数,该函数通过从散列值中提取salt来验证密码,然后将明文与相同的salt进行散列并比较结果,以加密安全的方式击败定时攻击。如果这是bcrypt,请使用bcrypt.checkpw将输入的密码与数据库中的哈希进行比较,您不能使用输入的密码在数据库中查找用户,因为您没有在数据库中插入数据时使用的salt。@Martijn和@e4c5我包含了真正的哈希密码。hashpw是从bcrypt导入的。不,我不是在生产新的盐。删除salt密码后,我仍然收到同样的不希望收到的消息。@tapeli:请更新您的问题以包含该信息,显示hashpw和gensalt的来源。在没有相反证据的情况下,gensalt似乎产生了一种新的盐。