2016-07-11 11 views
1

Ich versuche ein AI-like chatbot zu erstellen, und eine seiner Funktionen ist ein Login. Ich habe den Login-Code vorher benutzt und es funktioniert gut, aber ich habe jetzt Schwierigkeiten mit dem Code, der sich mit dem Hashing der Passwörter beschäftigt. Hier ist der Code:Warum muss ich vor dem Hashing in Python die Codierung deklarieren, und wie kann ich das tun?

import hashlib 
... 
register = input ("Are you a new user? (y/n) >") 

password_file = 'passwords.txt' 
if register.lower() == "y": 
    newusername = input ("What do you want your username to be? >") 
    newpassword = input ("What do you want your password to be? >") 

    newpassword = hashlib.sha224(newpassword).hexdigest() 

    file = open(password_file, "a") 
    file.write("%s,%s\n" % (newusername, newpassword)) 
    file.close() 

elif register.lower() == ("n"): 
    username = input ("What is your username? >") 
    password = input ("What is your password? >") 

    password = hashlib.sha224(password).hexdigest() 

    print ("Loading...") 
    with open(password_file) as f: 
     for line in f: 
      real_username, real_password = line.strip('\n').split(',') 
      if username == real_username and password == real_password: 
       success = True 
       print ("Login successful!") 
       #Put stuff here! KKC 
    if not success: 
     print("Incorrect login details.") 

Und hier ist das Ergebnis, das ich bin immer:

Traceback (most recent call last): 
    File "<FOLDERSYSTEM>/main.py", line 36, in <module> 
    newpassword = hashlib.sha224(newpassword).hexdigest() 
TypeError: Unicode-objects must be encoded before hashing 

Ich habe die Codierung sah ich denke, sollte ich (Latin-1) verwenden und fand die erforderliche Syntax, hinzugefügt, dass in und ich immer noch das gleiche Ergebnis erhalten.

Antwort

1

Hashing funktioniert auf Bytes. str Objekte enthalten Unicode-Text, keine Bytes, daher müssen Sie zuerst codieren. Wählen Sie eine Kodierung, die a) mit allen Codepunkten umgehen kann, denen Sie wahrscheinlich begegnen, und vielleicht b) anderen Systemen, die dieselben Hashes erzeugen.

Wenn Sie der einzige Benutzer der Hashes sind, dann wählen Sie einfach UTF-8; es kann alle Unicode und ist am effizientesten für westliche Texte behandeln:

newpassword = hashlib.sha224(newpassword.encode('utf8')).hexdigest() 

Der Rückgabewert von hash.hexdigest() ist ein Unicode str Wert, so dass Sie sicher sind, dass Sie aus Ihrer Datei lesen mit den str Werten zu vergleichen.

+0

Danke, aber was meinst du mit 'der einzige Benutzer der Hashes'? Das ist ein GitHub-Projekt, also wird es noch funktionieren? Außerdem habe ich das ausprobiert und Registrierung ist in Ordnung, aber wenn ich versuche mich anzumelden gibt es mir: "Traceback (zuletzt letzten Anruf): Datei"/home/pi/Desktop/KittyKatCoder-edison-ai-3ae75b2/main.py ", Zeile 50, in real_username, real_password = Zeile.strip ('\ n'). split (',') ValueError: benötigt mehr als 1 zu entpackenden Wert. – KittyKatCoder

+0

@KittyKatCoder: sagen Sie teilen diese Passwort-Hashes mit einem anderen System; Wenn dieses System UTF-16 zum Kodieren von Unicode-Text in Bytes verwendet, müssen Sie diese Kodierung anpassen. Ich würde wetten, dass die meisten Systeme UTF-8 verwenden. –

+0

Okay, danke. Was kann ich gegen den Fehler tun? – KittyKatCoder