Kolben-bcrypt - ValueError: Invalid Salz
War ich fertig, eine einfache Benutzer-login mit Kolben und Kolben-Bcrypt. Jedoch, wenn Sie versuchen, die Anmeldung mit einem Benutzer, der gespeichert ist in meine Datenbank, bekomme ich immer diese Fehlermeldung
ValueError: Invalid salt
models.py
class User(db.Model):
__tablename__ = "users"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=False)
email = db.Column(db.String, nullable=False)
password = db.Column(db.String, nullable=False)
posts = db.relationship("Post", backref="author", lazy="dynamic")
def __init__(self, name, email, password):
self.name = name
self.email = email
self.password = bcrypt.generate_password_hash(password)
def __repr__(self):
return '<User {}>'.format(self.name)
views.py
@app.route("/login", methods=["GET", "POST"])
def login():
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter(User.name == form.username.data).first()
if user and bcrypt.check_password_hash(user.password, form.password.data):
flash("you were just logged in!")
login_user(user)
return redirect(url_for("home"))
else:
flash("bad username or password")
return render_template("login.html", form=form)
forms.py
class LoginForm(Form):
username = StringField('username', validators=[DataRequired()])
password = PasswordField('password', validators=[DataRequired()])
- Hmm, ich fühle deinen hash ist nicht immer richtig abgespeichert in der DB. Sah ein paar Dinge, und Sie zu sein scheinen mit Kolben-Bcrypt richtig. Was ist der Wert der user.Passwort?
- dies ist der Wert der
user.password
'\\x24326224313224483352757749766438764134333757365142464f4f4f464959664d66673575467873754e466250716f3166375753696955556b2e36'
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im Grunde möchten Sie die Verschlüsselung Ihrer Daten, bevor der hash -: Passwort.encode('utf-8'). Wenn es darum geht, z.B. unicode, es kann Fehler auslösen.
Schauen Sie auch hier: https://github.com/maxcountryman/flask-bcrypt/issues/9
flask-bcrypt
ist, wird die Eingabe codiert automatisch, basierend auf der aktuellen version von Python. Das ist also nicht mehr nötig...mod_wsgi
zuuWSGI
mit nginx. Aber es hängt von Ihrem problem. Was haben Sie versucht?Mein problem ist ähnlich wie beschrieben von @tomClark
Verwende ich Postgres als meine DDBB und seine Treiber, oder die DDBB-system, codieren immer eine bereits kodierten string. Die zweite encode Prozess zu erstellen, eine ungültige hash wie dieser:
Einen richtigen hash sieht wie folgt aus:
Es zu lösen, ich decodieren den hash zu utf8 zunächst als speichern Sie es auf der DDBB.
Beispiel-code:
flask_bcrypt.generate_password_hash(password).decode('utf8')
Scheint es, dass diese Ausnahme wird auch zurückgegeben, wenn alles schief geht, während das hashing eines Passworts.
Aus der
bcrypt
Quelle fürhashpw()
:Den
bcrypt
Paket (dasFlask-Bcrypt
verwendet, um die Arbeit zu erledigen) zurückValueError: Invalid salt
wenn der Aufruf der OS ist bcrypt lib einen Fehler zurück. Also, wenn aus irgendeinem Grund es ist nicht möglich, zum aufrufen von bcrypt lib an alle, es wird immer noch (falsch) zurück, dieInvalid salt
Fehler.Scheint ein Fehler in der
bcrypt
Paket von der Implementierung sollte geprüft werden, ob für bestimmte Werte vonretval
.In meinem Fall, der Fehler stellte sich heraus, verwandt zu sein Kolben läuft unter Apache
mod_wsgi
imvirtualenv
. Ich konnte laufen Kolben direkt und ohne Probleme (mitflask-cli
), aber die exakt gleichen app-Instanz würde nicht erfolgreich nutzenbcrypt
bei der Ausführung untermod_wsgi
.Gelöst wurde das problem durch änderungen an der Apache-config zu verwenden, die virtualenv als Haupt-Python-Umgebung für
mod_wsgi
.In
httpd.conf
oder unter/etc/httpd/conf.d/...
hinzufügen:Mehr Informationen zu dieser Konfiguration finden Sie hier: Virtuelle Umgebungen — mod_wsgi-Dokumentation
Ich immer noch vermute, dass mein spezielles problem ist der Zusammenhang etwas verdeckt durch mein system das python site-packages, oder etwas anderes mit Bezug zu python gehören.
Edit: Einstellung
WSGIPythonHome
stellte sich heraus, nicht um das problem zu beheben. Am Ende wechselte ich auf uWSGI mit nginx.In meinem Fall, das problem war mit einem Typ-Konvertierung, was auf Passwort-Speicher. Mit
bcrypt.generate_password_hash(plaintext)
gibt einen binären Wert, wieb'$2b$12$zf/TxXZ4JJZ/lFX/BWALaeo0M.wNXrQXLqIFjmZ0WebqfVo9NES56'
.Wie mir war, Ihre Spalte password ist ein string:
Fand ich, dass die Generierung des hash-oben, die Speicherung, die Binär-Wert, den es in meinem string password string-Spalte, dann einfach abrufen es führte zu einem anderen Wert aufgrund von SQLAlchemy Typ-Konvertierung - nichts zu tun mit bcrypt an alle!
Eine Frage, die auf die richtige Spalte Typ hat mir geholfen, zu realisieren, dass für die korrekte hin-ich hatte zum speichern von Passwörtern als binäre. Versuchen Sie ersetzen Ihre Spalte definition mit:
Ich weiß es nicht sicher, aber vermuten, dass die verschiedenen Produktions-Umgebungen und Datenbanken behandeln diese Art der Konvertierung anders (reversibel, in einigen Fällen, in anderen nicht), vielleicht erklärt das mit gemischtem Erfolg @Samuel Jaeschke hat.
Dies erklärt auch, warum die Kodierung der input-string in einen eingeschränkten Zeichensatz (eine frühere Lösung) könnte helfen, in einigen Fällen und nicht andere - wenn es bewirkt, dass der an/aus-Typ-Konvertierung zu arbeiten, dann werden Sie sich erholen den richtigen hash aus der Datenbank vergleichen.
Jedenfalls, dass dieses problem gelöst für mich.
Bewerben Sie sich
.decode('utf-8')
zu Ihremself.password
:Ich glaube, Sie sind mit python 3 und bcrypt0.7.1. zuerst müssen Sie löschen Sie den Benutzer in Ihrer Datenbank haben, dann gehen Sie zu Ihren Modellen hinzufügen und .decode('utf-8') zu den generate_password_hash () - Methode wie folgt:
Alternativ können Sie deinstallieren Kolben-bcrypt==0.7.1 und installieren, Kolben-bcrypt==0.62. Stellen Sie sicher, dass Sie löschen Sie den Benutzer aus den Tabellen vor der Installation von flask-bcrypt==0.62
Ich hatte ein ähnliches problem. Mein code für die überprüfung des Passworts wie folgt:
Wenn ich die umgekehrte Reihenfolge zu:
Funktionierte es gut.
Ich hatte ein ähnliches problem, bekam ein: ValueError: Invalid Salz - es stellte sich heraus, dass in meinen Modellen hatte ich zu wenige Zeichen in meinem Artikel:
In meiner Datenbank und Modellen, die ich hatte, um es zu ändern:
und es funktionierte.
Vollständig Sie brauchen nicht
flask-bcrypt
für die Verwendungbcrypt
.Nur so etwas tun:
Ich hatte das gleiche problem.
Es stellte sich heraus, dass die Kombination aus Benutzername und Kennwort habe ich versucht zu überprüfen, war nicht gehasht in den ersten Platz.
Stellen Sie sicher, dass das Kennwort für den Benutzernamen ein, den Sie versuchen zu prüfen, ist bereits gehasht und nicht nur text.
Wenn das Passwort gespeichert ist, im Klartext, nicht gehasht, werden Sie diese Fehlermeldung erhalten.