Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 哈希密码永远不会淡化_Python_Mysql_Passwords_Flask - Fatal编程技术网

Python 哈希密码永远不会淡化

Python 哈希密码永远不会淡化,python,mysql,passwords,flask,Python,Mysql,Passwords,Flask,我正在使用flask micro框架,并使用msyql后端手动设置身份验证 我的sql脚本将散列密码存储在以下数据类型中:VARCHAR(50),由generate\u password\u hash函数生成后: `Password` VARCHAR(50) NOT NULL , VARCAHR(50岁)已经足够了,我想 以下是我正在使用的库: from werkzeug import check_password_hash, generate_password_hash @app.r

我正在使用flask micro框架,并使用msyql后端手动设置身份验证

我的sql脚本将散列密码存储在以下数据类型中:
VARCHAR(50)
,由
generate\u password\u 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,))

将mysql中的数据类型设置为
Password VARCHAR(160)NOT NULL

实际上不需要160个字符

>>> from werkzeug.security import generate_password_hash
>>> generate_password_hash("test")
'sha1$lYmusy7y$8fc97f79a9809ab4eaee4de08d1e182d04f3dc07'
>>> len(generate_password_hash("test"))
54
使用默认哈希算法sha1已经足够了

请参见以下内容:

你使用了尴尬的术语:“脱盐”——用这种方法,任何东西都不会以任何方式被解密


请阅读一些关于这一切是如何运作的,你要对用户的安全负责。

我想我已经明白了。我将数据类型设置为VARCHAR(160),并且不再截断。请考虑使用参数化查询而不是与“+ String(…))进行字符串连接。参见(4。从顶部的绿色框)@ SalePulsNeld,它执行相同的thou-口令,用户ID =游标。@Dave,只要你使用干净的输入,它就会产生相同的结果。养成使用参数化查询的习惯,否则有一天你会发现自己成为SQL注入的受害者。