The*_*net 3 python mysql passwords flask
我正在使用flask微框架并使用msyql后端手动设置身份验证.
我的sql脚本在此数据类型中存储散列密码:VARCHAR(50)在generate_password_hash函数生成之后:
`Password` VARCHAR(50) NOT NULL ,
Run Code Online (Sandbox Code Playgroud)
我认为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)
Run Code Online (Sandbox Code Playgroud)
所以这就是问题所在:
elif not check_password_hash(password, request.form['password']):
Run Code Online (Sandbox Code Playgroud)
始终返回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,))
Run Code Online (Sandbox Code Playgroud)
你真的不需要160个字符.
>>> from werkzeug.security import generate_password_hash
>>> generate_password_hash("test")
'sha1$lYmusy7y$8fc97f79a9809ab4eaee4de08d1e182d04f3dc07'
>>> len(generate_password_hash("test"))
54
Run Code Online (Sandbox Code Playgroud)
使用默认的哈希算法sha1就足够了.
瞧,这是如何产生的: http://werkzeug.pocoo.org/docs/utils/#werkzeug.security.generate_password_hash
你使用尴尬的术语:"desalts" - 使用这种方法,任何方式都无法解密.
请仔细阅读一下这一切是如何工作的,您要对用户的安全负责.
| 归档时间: |
|
| 查看次数: |
1723 次 |
| 最近记录: |