Как правильно хранить результат bcrypt hashpw в БД? - PullRequest
0 голосов
/ 15 марта 2020

Я нахожусь в процессе создания системы входа в систему. Я использую python flask и в качестве базы данных Prostgresql.

Я думаю, что просто неправильно храню значение ha sh. Я сохранил его как vachar 255

Мой код:

from flask import Flask, render_template, redirect, request, url_for, session
from flask_sqlalchemy import SQLAlchemy
import bcrypt
import psycopg2

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:PostGreSQL_13@localhost/test'
sql = SQLAlchemy(app)

@app.route('/')
def home():
    return render_template("home.html")

@app.route('/register', methods=["GET","POST"])
def register():
    if request.method == "GET":
        return render_template("register.html")
    else:
        name = request.form['name']
        email = request.form['email']
        password = request.form['password'].encode('utf-8')
        hash_password = bcrypt.hashpw(password, bcrypt.gensalt())

        t_host = 'localhost'
        t_port = "5432"
        t_dbname = "test"
        t_user = "postgres"
        t_pw = "password"

        db_conn = psycopg2.connect(host=t_host, port=t_port, dbname=t_dbname, user=t_user, password=t_pw)
        db_cursor = db_conn.cursor()

        db_cursor.execute("INSERT INTO users (UserName,UserEmail,UserPassword) VALUES (%s,%s,%s)",(name,email,hash_password,))
        db_conn.commit()

        session['name'] = name
        session['email'] = email
        return redirect(url_for("home"))



@app.route('/login', methods=["GET","POST"])
def login():
    if request.method == "POST":
        email = request.form['email']
        password = request.form['password'].encode('utf-8')

        t_host = 'localhost'
        t_port = "5432"
        t_dbname = "test"
        t_user = "postgres"
        t_pw = "password"

        db_conn = psycopg2.connect(host=t_host, port=t_port, dbname=t_dbname, user=t_user, password=t_pw)
        db_cursor = db_conn.cursor()

        db_cursor.execute("SELECT username, useremail, userpassword FROM users WHERE useremail=%s",(email,))

        user = db_cursor.fetchone()
        db_conn.close()

        if len(user) > 0:
            name = user[0]
            if bcrypt.hashpw(password, user[2].encode('utf-8')) == user[2].encode('utf-8'):
                session['name'] = user[0]
                session['email'] = user[1]
                return render_template("home.html")

        else:
            return "Versuch es doch Nochmal"
    else:
        return render_template("login.html")



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

if __name__ == '__main__':
    app.secret_key = '012#!ApaAjaBoleh)(*^%'
    app.run(debug=True)

процедура, которую я получил из видео на Youtube. см. вложение.

Мне нужна система входа в систему, и она мне рекомендована, она работает довольно хорошо.

Последняя должна работать как-то, и если она будет работать, я был бы очень рад.

Может кто-нибудь сказать мне, что я делаю неправильно, или мое приложение с базой данных правильно или неправильно?

1 Ответ

0 голосов
/ 16 марта 2020

Я ничего не знаю об этом языке, который вы используете, но любая реализация bcrypt выведет строку, похожую на:

$2a$12$ieXy2Rj/TEGqVRx0JihGFesujNFCdmlQWpUaTNvwQ0XuB3lzOcTWK

Да, вам следует сохранить эту строку varchar в вашей базе данных.

...