私は私の目的は、ログイン時に提供されたパスワードに基づいてユーザを認証するためにある3つの列Python/SQLite3では、データベーステーブルのクエリに使用する変数をどのように定義しますか?
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"
しかし、システムがメッセージ「が見つかりませんユーザー」を返します。希望の出力は、 "Welcome guest"というメッセージです。hashpw
とgensalt()
はbcrypt
からインポートされます。
私は間違って変数 "パスワード"を定義していると確信しています。どのようにしてそのような変数を適切に定義しますか?
:
フォームだけではなく、パスワード、ユーザ名に沿って送信する必要があります。私はあなたがここで使っているハッシュ関数を知らないのですが、ほとんどのパスワードハッシュはより長いハッシュを生成します。カラム幅をハッシュ長で確認してください – e4c5
'hashpw 'はどこから来たのですか?あなたは**それが生成する出力がデータベースの列情報と一致する**特定の**ですか?また、あなたは** new **塩を生成していますが、これはほとんど間違ったことです。通常、* username *をデータベースと照合し、ハッシュされたパスワードを取得し、平文入力されたパスワードとともにパスワードを検証する別の関数に渡します(ハッシュ値から塩を取り出し、 *同じ塩*と比較して結果を暗号的に安全な方法で(タイミング攻撃を打ち負かす)。 –
(bcryptの場合は、bcrypt.checkpw()を使用して、入力したパスワードとデータベースのハッシュを比較します。*入力されたパスワードを使用してデータベース内のユーザーを特定することはできません。あなたがデータベースにデータを挿入したときに使用される塩*)。 –