python - 当我检查 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>
解决方案
谢谢,但这(我认为)正是我所拥有的。我不知道为什么我有错误我有 .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>
推荐阅读
- fabricjs - 如何在我用来更新fabric js中文本的这段代码中添加文本间距和笔划等属性?
- powershell - 如何从给定的 URL 解析基本路径?
- python - Flask 使用参数重定向到外部 URL
- wordpress - 如何仅在 wordpress 主页上禁用缓存
- r - 从R中的作者姓名中提取非英文字符,除了空格
- javascript - 为什么 Flow 假设这个函数返回一个 RegExp?
- python - 写入 python 和 panda 文件时出现问题
- html - html5 视频“海报”属性是否会阻止视频加载?
- common-lisp - (ASDF 3) 如何将文件|组件标记为“脏”或需要重建?
- react-native - 我是 React-Native 的新手,我试图在单击按钮后从一个屏幕移动到另一个屏幕