2017-05-30 12 views
0

私は私の目的は、ログイン時に提供されたパスワードに基づいてユーザを認証するためにある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"というメッセージです。hashpwgensalt()bcryptからインポートされます。

私は間違って変数 "パスワード"を定義していると確信しています。どのようにしてそのような変数を適切に定義しますか?

+0

フォームだけではなく、パスワード、ユーザ名に沿って送信する必要があります。私はあなたがここで使っているハッシュ関数を知らないのですが、ほとんどのパスワードハッシュはより長いハッシュを生成します。カラム幅をハッシュ長で確認してください – e4c5

+0

'hashpw 'はどこから来たのですか?あなたは**それが生成する出力がデータベースの列情報と一致する**特定の**ですか?また、あなたは** new **塩を生成していますが、これはほとんど間違ったことです。通常、* username *をデータベースと照合し、ハッシュされたパスワードを取得し、平文入力されたパスワードとともにパスワードを検証する別の関数に渡します(ハッシュ値から塩を取り出し、 *同じ塩*と比較して結果を暗号的に安全な方法で(タイミング攻撃を打ち負かす)。 –

+1

(bcryptの場合は、bcrypt.checkpw()を使用して、入力したパスワードとデータベースのハッシュを比較します。*入力されたパスワードを使用してデータベース内のユーザーを特定することはできません。あなたがデータベースにデータを挿入したときに使用される塩*)。 –

答えて

1

あなたは完全に異なる塩を新しいハッシュ、1を生成している:

password = hashpw(password, gensalt()) 

あなたはパスワードでユーザーを検索することはできません。塩漬けされたハッシュを使用することの全ポイントは、ハッカーが虹のテーブル(共通のハッシュテーブルを使用することは不可能ですが、塩なし)をハッシュにマッチさせることです。これと同じ保護によって、特定のユーザーにどのような塩が使用されたかを知ることが不可能になり、新しい塩から別のハッシュを生成することがほぼ保証されます。

はその後、保存されたハッシュに対してしっかりテストにパスワードをbcrypt.checkpw()機能を尋ねる、塩漬けパスワードを取得、今をルックアップするためにユーザ名を使用する必要があります。ハッシュ値には塩が含まれ、bcryptは塩を抽出し、同じハッシュが生成されていることを検証するために使用します。比較にはタイミング攻撃から保護する必要がありますが、自分でこのチェックを再実装しないでください。パスワード欄がfarrrrr狭すぎに見える一見

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" 
関連する問題