首页 > 解决方案 > 当我检查 pw 时,bcrypt 中的盐无效

问题描述

使用烧瓶 python。当我尝试比较用 bcrypt.hashpw() 加密的散列密码时说无效盐。

现在我测试它,如果我把这个 if 语句放入了,但只有在 html 表单的密码字段中我粘贴密码散列(问题是我需要输入普通密码)所以比较我确定表单字段html 并且仅当我需要输入 bcrypt.checkpw(password_in_the_login_form.html, password_hashed_in_the_db) 时,连接到数据库以获取用户密码才会失败,这每次都说 Invalid Salt,这里是我的代码:

app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = '01b0cfa6c076da9264d7ea8b44967445'
app.config['MYSQL_DB'] = 'flaskdb'
app.config['MYSQL_CURSORCLASS'] = 'DictCursor'
mysql = MySQL(app)

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        email = request.form['Email']
        password = request.form['Password']

        curl = mysql.connection.cursor(MySQLdb.cursors.DictCursor)
        curl.execute("SELECT * FROM users WHERE Email=%s",(email,))
        user = curl.fetchone()        

        if len(user) > 0:
            if user["Password"] == password:               
                session['Email'] = email
                session['Nickname'] = user["Nickname"]
                return render_template("profile.html")
            else:
                return "Error password and email not match"
        else:
            return "Error user not found"
    else:
        return render_template("login.html")
  

@app.route('/logout')
def logout():
    session.clear()
    return redirect(url_for("home")) 

@app.route("/signup", methods=["GET", "POST"])       
def signup():
    if request.method == 'GET':
        return render_template("signup.html")
    else:
        nickname = request.form['Nickname']
        firstName = request.form['First_Name']
        lastName = request.form['Last_Name']
        email = request.form['Email']
        password = request.form['Password'].encode('utf-8')
        
        hash_password = bcrypt.hashpw(password, bcrypt.gensalt(14))

        cur = mysql.connection.cursor()
        cur.execute("INSERT INTO users (Nickname, First_Name, Last_Name, 
        Email, Password) VALUES (%s,%s,%s,%s,%s)",(nickname,firstName,lastName,email,hash_password,))
        mysql.connection.commit()
        return redirect(url_for('home'))

if __name__ == '__main__':
    app.secret_key = 'bb8ef1d0a8de0bf09b4b2aaee861a7d5'
    app.run(debug=True)

和 html 表单

    <form action="/signup" method="POST">
    <input type="text" class="form-field" name="Nickname" placeholder="Nickname">
    <input type="text" class="form-field" name="First_Name" placeholder="First Name">
    <input type="text" class="form-field" name="Last_Name" placeholder="Last Name">
    <input type="email" class="form-field" name="Email" placeholder="Email">
    <input type="password" class="form-field" name="Password" placeholder="Password">
    <button type="submit" class="signup-btn">SIGNUP</button>
    </form>

<form action="/login" method="POST">
  <input type="email" class="form" name="Email"><br>
  <input type="password" class="form" name="Password"><br>
  <button type="submit" class="login-btn">LOGIN</button>
</form>

标签: pythonflaskbcrypt

解决方案


谢谢,但这(我认为)正是我所拥有的。我不知道为什么我有错误我有 .hashpw 散列密码并将其存储在数据库中,这没关系,我看到数据库中的密码加密但 .checkpw 将表单中的密码与密码进行比较在数据库中失败,说 Invalit salt 代码正是这样比较:

if bcrypt.checkpw(password, userPassworddb):

其中 password 是用户在登录表单中输入的密码 .encode('utf-8') 和 userPassworddb 是在数据库中加密的密码(也需要转换 userPassworddb.encode('utf-8') 原因如果我不要这样做,调试器说我需要在比较之前进行编码)

在从 html 登录时,我有这个:

<form action="/login" method="POST">
  <input type="email" class="form" name="Email"><br>
  <input type="password" class="form" name="Password"><br>
  <button type="submit" class="login-btn">LOGIN</button>
</form>

推荐阅读