SHA-512 Hashes mit Python berechnen

Hallo,
ich hoffe ich habe bei der Boardsuche nichts übersehen und das richtige Unterforum ausgesucht :wink:

Ich lese zurzeit das Buch "Violent Python" von TJ O'Connor. Dort wird beschrieben, wie man einen Wörterbuch-Angriff via Python machen kann.

Als Beispiel wird, soweit ich das sehe DES als Algorithmus verwendet.

Code:
programmer$ python
>>> import crypt
>>> crypt.crypt("egg", "HX")
'HX9LLTdc/jiDE'

"egg" hierbei als Passwort und "HX" als Salt.

Soweit ist alles klar. Zum Schluss weist der Autor darauf hin, dass heutige Systeme andere Algorithmen verwenden und zeigt einen SHA-512 Hash als Beispiel. Als Aufgabe bleibt das Python-Script so zu ändern, dass es SHA-512 Hashes cracken könnte. Als zusätzlichen Hinweis sagt der Autor, dass die hashlib-library SHA-512 unterstützt.

Also habe ich mich ans Werk gemacht und versucht das zu implementieren (ich testete es an meinem eigenen Passwort), aber mit der hashlib kam ich immer auf ganz andere Hashes.

Ich fragte Google und fand unteranderem das hier:

Code:
import hashlib
output = hashlib.sha512( salt + password ).hexdigest()

So sollte es nach mehreren Quellen funktionieren, aber die Hashes hatten keinerlei Ähnlichkeit mit denen in meiner /etc/shadow.
Meine erste Frage wäre nun: Warum? Was habe ich bei der hashlib übersehen oder vielleicht falsch gemacht?

Ich habe dann noch weiter gesucht und gesucht und eine Lösung gefunden, die mich überrascht hat.

Code:
>>> import crypt
>>> output = crypt.crypt('password', '$6$%s$' % salt)

Nach einiger Recherche kam ich zu dem Schluss, dass crypt auf die cryptlib vom System gelinked sein könnte und fand heraus, dass diese in neueren Versionen auch SHA-512 unterstützt.

Weswegen ich hier nun schreibe: Zum einen suche ich den Fehler bei der Implementierung mit hashlib und zum anderen frage ich mich ob meine Vermutung, warum crypt das kann richtig ist.

(Zwischenzeitlich fragte ich mich schon ob meine Passwörter vielleicht nicht mit SHA-512 verschlüsselt wurden, aber laut Google und Ubuntu-Wiki zeigt die $6$ zu Beginn an, dass es SHA-512 ist.)

Ich habe das ganze auf einem Rechner mit Lubuntu getestet.

Vielen Dank schonmal für Eure Hilfe :)
 
Die crypt-Funktion ist etwas komplizierter als nur SHA-512(salt+password). Es wurden Gegenmaßnahmen eingebaut, die eine Brute Force bzw. Dictionary Attack erschweren, indem crypt aufwendiger zu berechnen ist als der zugrunde liegende Algorithmus MD5/SHA-2 etc. Dadurch lassen sich weniger Passwörter pro Sekunde testen und der Angreifer benötigt mehr Zeit den Hash zu knacken. Diese Technik nennt sich Key stretching

First the passphrase and salt are hashed together, yielding an MD5 message digest. Then a new digest is constructed, hashing together the passphrase, the salt, and the first digest, all in a rather complex form. Then this digest is passed through a thousand iterations of a function which rehashes it together with the passphrase and salt in a manner that varies between rounds. The output of the last of these rounds is the resulting passphrase hash.

Quelle Wikipedia
Crypt (C) - Wikipedia, the free encyclopedia


crypt mit SHA-256/512 unterscheidet sich nochmal dazu.

Siehe:
Unix crypt with SHA-256/512

bzw.
http://www.akkadia.org/drepper/SHA-crypt.txt


Es selber zu implementieren ist vielleicht ne nette Übung, aber etwas Zeit muss man schon einplanen. Wobei solch technischen Spezifikationen schonmal sehr nervig in der Umsetzung sein können. Da dann lieber den Referenz-C Code angucken, sofern man C versteht.
 
Zuletzt bearbeitet:
Zurück
Oben