3

フラスコのマイクロフレームワークを使用しており、msyqlバックエンドを使用して手動で認証を設定しています。

私のSQLスクリプトは、ハッシュ化されたパスワードを次のデータ型で保存しています:、関数VARCHAR(50)によって生成された後:generate_password_hash

  `Password` VARCHAR(50) NOT NULL ,

VARCAHR(50)は私が思っていた以上のものです...

これらは私が使用している次のライブラリです:

from werkzeug import check_password_hash, generate_password_hash


@app.route('/login/', methods=['GET', 'POST'])
def login():
    """Logs the user in."""
    if g.user: return redirect(url_for('main'))
    error = None
    if request.method == 'POST':
        sql = "select password, userid from users where username = " + stringify(request.form['username'])
        cursor = g.db.cursor()
        cursor.execute(sql)
        user = cursor.fetchall()
        user = user[0]
        password = user[0]
        userid = user[1]
        if user is None:
            error = 'Invalid username'
        elif not check_password_hash(password, request.form['password']):
            error = 'Invalid password'
        else:
            flash('You were logged in')
            session['userid'] = userid
            return redirect(url_for('main'))
    return render_template('login.html', error=error)

だからこれが問題です:

elif not check_password_hash(password, request.form['password']):

常にfalseを返します。

更新:私はこれを登録で取得します:

Users/Dave/Websites/fh/app.py:143: Warning: Data truncated for column 'Password' at row 1
  g.db.cursor().execute("insert into users (username, email, password) values (%s, %s, %s)" % (username, email, password,))
4

2 に答える 2

6

実際には160文字は必要ありません。

>>> from werkzeug.security import generate_password_hash
>>> generate_password_hash("test")
'sha1$lYmusy7y$8fc97f79a9809ab4eaee4de08d1e182d04f3dc07'
>>> len(generate_password_hash("test"))
54

デフォルトのハッシュアルゴリズムsha1で十分です。

これがどのように生成されるかをここで確認してください: http ://werkzeug.pocoo.org/docs/utils/#werkzeug.security.generate_password_hash

厄介な用語を使用します:「脱塩」-この方法では、どのような方法でも復号化されることはありません。

これがどのように機能するかについて少し読んでください。あなたはユーザーのセキュリティに責任があります。

于 2012-11-16T18:41:09.947 に答える
0

mysqlのデータ型を次のように設定します Password VARCHAR(160) NOT NULL

于 2012-11-16T07:00:34.343 に答える