2017-12-18 4 views
0

Ich entwickle eine Webapp mit Python und Kolben. Es hat ein Benutzersystem, also natürlich ein Registrierungsformular. Ich benutze, um das Passwort des Benutzers, der sich registrieren will, passlib.hash.sha256 zu verschlüsseln. Hier ist, was ich tue:sha256_crypt.encrypt immer einen anderen Hash zurück

from passlib.hash import sha256_crypt as sha256 
[...] 
if request.method == "POST" and form.validate(): 
    username = request.form['username'] 
    password = request.form['password'] 
    confirm_password = request.form['confirm_password'] 
    email = request.form['email'] 

    password = sha256.encrypt(password) #Encryption. 



    c, conn = connection('accounts') #Connection to the database 


    x = c.execute("SELECT * FROM accounts WHERE username = '%s' OR email = '%s'" %(thwart(username), thwart(email))) 

    if x: 
     flash("We are very sorry, but this Username/Email-address is already taken. Please try again") 
    else: 
     c.execute('INSERT INTO accounts VALUES ("%s", "%s", "%s")' %(thwart(username), thwart(password), thwart(email))) 
     conn.commit() 
     flash('Succesfully Registered!') 

In der Datenbank wird der Hash immer variiert, auch wenn das gleiche Passwort inputed wurde. Weiß jemand warum? Was mache ich falsch?

+0

Sie haben über das Konzept herausgefunden von Salz https://en.wikipedia.org/wiki/Salt_(cryptography). Sind Sie sicher, dass Sie für die Authentifizierung qualifiziert sind? –

+0

Was meinst du mit "qualifiziert" – MisterMM23

+0

ich sehe. Aber ich habe nichts programmiert, das zufällige Daten hinzufügen würde. Ist das neu bei Pythons sha256? – MisterMM23

Antwort

1

fristly Bitte beachten Sie, dass sha256_crypt.encrypt(..) 1.7 seit Version ist veraltet und wird stattdessen umbenannt sha256_crypt.hash(..) so haben Sie

hash = sha256_crypt.hash("password") 

für den Hash zu schaffen. Da der Hash ein zufälliges Salz enthält, können Sie nicht den Hash neu zu berechnen und vergleichen, stattdessen sollten Sie die Hash-Lookup in der Tabelle, und verwenden Sie es dann in einem sha256_crypt.verify() wie:

sha256_crypt.verify("password", hash) 
+0

ist _hash_ für den Hash, der aus der Datenbank oder den eingebauten Typ "Hash" extrahiert wird? – MisterMM23

+0

Die Aussage: 'hash = sha256_crypt.hash (" Passwort ")' Ich nahm direkt aus der Dokumentation. Der erste "Hash" ist das Ergebnis einer Berechnung, die durch den Aufruf der Methode "hash (..)" durchgeführt wurde und in der Datenbank gespeichert werden muss. –

+0

In Ordnung. Es funktionierte! Vielen Dank! – MisterMM23

-1

Versuchen Sie pycrypto .sha256 statt, Passlib scheint nicht die richtige Lösung für Ihre Anforderung, eine ungesalzene Hash zu berechnen.

Verwandte Themen