Ich lerne Python. Ich kann nicht herausfinden, warum hashlib.sha512(salt + password).hexdigest()
nicht die erwarteten Ergebnisse liefert.hashlib vs crypt.crypt() in Python. Warum unterschiedliche Ergebnisse?
Ich bin auf der Suche nach einer reinen Python-Implementierung der Entsprechung von Ulrich Drepper sha512crypt.c algorithm. (Es dauerte eine Weile, bis ich herausgefunden hatte, wonach ich suchte.)
Laut der man-Seite für crypt
auf meinem Ubuntu 12.04-System verwendet crypt SHA-512 (weil die Strings mit $ 6 $ beginnen).
Der folgende Code überprüft, dass das Verhalten erwartet wird, wenn ich Python-Wrapper der Systemkrypta (d. H. Crypt.crypt()) aufrufen. Ich möchte hashlib.sha512 oder eine andere Python-Bibliothek verwenden, um dasselbe Ergebnis wie crypt.crypt() zu erhalten. Wie?
Dieser Code zeigt das Problem ich begegnet:
import hashlib, crypt
ctype = "6" #for sha512 (see man crypt)
salt = "qwerty"
insalt = '${}${}$'.format(ctype, salt)
password = "AMOROSO8282"
value1 = hashlib.sha512(salt + password).hexdigest() #what's wrong with this one?
value2 = crypt.crypt(password, insalt) #this one is correct on Ubuntu 12.04
if not value1 == value2:
print("{}\n{}\n\n".format(value1, value2))
Nach der Krypta Manpage, SHA-512 beträgt 86 Zeichen. Der Aufruf crypt()
in dem obigen Code entspricht dem. Allerdings ist die Ausgabe von hashlib.sha512 länger als 86 Zeichen, so ist etwas weiter Weg zwischen diesen beiden implmentations ...
Hier ist die Ausgabe für diejenigen, die nicht wollen, um den Code auszuführen:
051f606027bd42c1aae0d71d049fdaedbcfd28bad056597b3f908d22f91cbe7b29fd0cdda4b26956397b044ed75d50c11d0c3331d3cb157eecd9481c4480e455
$6$qwerty$wZZxE91RvJb4ETR0svmCb69rVCevicDV1Fw.Y9Qyg9idcZUioEoYmOzAv23wyEiNoyMLuBLGXPSQbd5ETanmq/
Ein weiterer Versuch basierend auf der ersten Rückmeldung hier. Kein Erfolg noch:
import hashlib, crypt, base64
ctype = "6" #for sha512 (see man crypt)
salt = "qwerty"
insalt = '${}${}$'.format(ctype, salt)
password = "AMOROSO8282"
value1 = base64.b64encode(hashlib.sha512(salt + password).digest())
value2 = crypt.crypt(password, insalt) #this one is correct
if not value1 == value2:
print("{}\n{}\n\n".format(value1, value2))
Ist Ihr Passwort (mit Ausnahme der Zahlen) ein Wort in Portugiesisch absichtlich oder war es ein peinlicher Zufall? Nur neugierig ':)' – JMCF125
Dieses Passwort ist ein echtes Passwort aus einer der großen Datenbanken von echten gestohlenen Passwörter, fwiw gezogen. – MountainX
Ich sehe. Ohne Salz wäre es in der Tat leicht zu knacken, sagen wir, mit einem aus einem kleinen portugiesischen Wörterbuch hergestellten Regenbogentisch. BTW, +1, das ist eine interessante Frage, obwohl ich Python nicht benutze. – JMCF125