Hash-Abgleicher in Python.

Hallo, ich wollte ein Programm schreiben, welches mir den Hash eines "/etc/shadows"-Gelisteten-Users (LInux) mit den (im Programm erstellten) Hashes abglicht, sodass ich das Passwort heraus bekomme.
Nun habe ich mich in Python herangewagt und ein kleines Script erstellt, es ist jetzt bloß die Frage, ob dieses Programm auch funktioniert.
Deswegen habe ich mich entschieden, den Code hier hochzuladen, sodass ihr, erfahrenderen, Python-Gurus herüber gucken könnt. Ich hoffe ihr könnt mir weiterhelfen.
Ein Blick auf meinem Anhang wäre nett. :)
 
Scheint, rein von der Syntax her, zu passen.
Doch trotzdem ein bisschen zu langwierig das Programm laufen zu lassen, da bräuchte ich wohl einen "Supercomputer"...
 
Oder du schreibst dein Programm derart um, dass du z.B. einzelne Wörter testen kannst. Das heisst, du trennst die einzelnen Funktionen (Wertgenerierung, Hashberechnung, Schleifendurchläufe) voneinander (Informatik-Grundprinzip: "Teile und Herrsche") und checkst jeweils die einzelnen Funktionen mit Hilfe der Unittests:

Wertgenerierung: Du erstellst eine Liste mit 10, 100, 1000 Werten und prüfst, ob die Liste 1000 unterschiedliche (!) Einträge besitzt (Randomisierung), die Länge der Wörter wirklich korrekt ist (Parameterkonsistenz), usw..

Hashberechnung: Ist H(Input) == "abcde...."?

Schleifendurchläufe: Wie viele Durchläufe macht deine Schleife bei einer bestimmten Eingabe? Wie viel sollte sie maximal machen können? Wie ändert sich das Ergebnis, wenn du bestimmte Schleifen weglässt?

Programmfluss: Unter welchen Bedingungen erreicht das Programm einen bestimmten Punkt im Code? Gibt es Punkte, die nicht erreicht werden? Gibt es redundante Punkte? Machen bestimmte Codeteile das gleiche (z.B. while a!=b: ... else: print("jetzt ist a==b"))? Welche Eingabe führt zu welcher Ausgabe, zu wie vielen Werten, zu wie vielen Durchläufen, zu wie vielen Hashes?

Beginne mit kurzen Passwörtern und kleinen Eingaben. Das ist gerade für Anfänger einfach zu handeln und viele mathematische Probleme lassen sich einfach an wenigen Händen abzählen ;)
 
Zuletzt bearbeitet:
Oder du schreibst dein Programm derart um, dass du z.B. einzelne Wörter testen kannst. Das heisst, du trennst die einzelnen Funktionen (Wertgenerierung, Hashberechnung, Schleifendurchläufe) voneinander (Informatik-Grundprinzip: "Teile und Herrsche") und checkst jeweils die einzelnen Funktionen mit Hilfe der Unittests:

Wertgenerierung: Du erstellst eine Liste mit 10, 100, 1000 Werten und prüfst, ob die Liste 1000 unterschiedliche (!) Einträge besitzt (Randomisierung), die Länge der Wörter wirklich korrekt ist (Parameterkonsistenz), usw..

Hashberechnung: Ist H(Input) == "abcde...."?

Schleifendurchläufe: Wie viele Durchläufe macht deine Schleife bei einer bestimmten Eingabe? Wie viel sollte sie maximal machen können? Wie ändert sich das Ergebnis, wenn du bestimmte Schleifen weglässt?

Programmfluss: Unter welchen Bedingungen erreicht das Programm einen bestimmten Punkt im Code? Gibt es Punkte, die nicht erreicht werden? Gibt es redundante Punkte? Machen bestimmte Codeteile das gleiche (z.B. while a!=b: ... else: print("jetzt ist a==b"))?

Beginne mit kurzen Passwörtern und kleinen Eingaben. Das ist gerade für Anfänger einfach zu handeln und viele mathematische Probleme lassen sich einfach an wenigen Händen abzählen ;)

Aber mein Code ist doch nicht falsch, oder?
Vielleicht stelle ich mich gerade ein bisschen doof an.
Es geht mir hier um ein, wahrscheinlich, humanes Passwort. Dann würde sich eine "wordlist" mehr lohnen?
 
Dein Programm erstellt zufällige Zeichenketten fester Länge ed aus Groß- und Kleinbuchstaben und Zahlen, berechnet davon das Unix-Passwort mit Hilfe der crypt-Implementierung des OS. Unter Windows erhältst du andere Passwörter, als unter Mac OSX und Linux, da die crypt-Implementierung eine andere ist. Das wird solange ausgeführt, bis das Passwort gefunden wurde. Die Schleife "while p<ed" macht keinen wirklichen Sinn. Wenn das Passwort gefunden wurde, dann wird nochmal geprüft, ob es wirklich das Passwort ist (if name == true:) und eine Meldung zurückgegeben. Im schlechtesten Fall hast du eine Dauerschleife, z.B. wenn das Passwort kürzer oder länger als ed ist. Im Optimalfall (erster generierter Wert ist das Passwort) zählt die erste Schleife von 0 bis ed, warum auch immer..

Wenn es das ist, was dein Programm machen soll, dann ist die Antwort auf deine erste Frage "ja", wenn nicht, dann ist sie "nein".

Eine Wordlist lohnt sich dann, wenn das Passwort aus (einer Kombination aus) Wörtern einer Sprache besteht. Eine Wordlist ist damit nur eine weitere Eingrenzung, die Sinn macht, wenn man das Ziel und vielleicht sogar schon das ein oder andere Passwort kennt.
 
Ehrlich gesagt habe ich mir den Code schon so gedacht, dass alle Möglichkeiten durchgegangen werden, somit hab ich es nach meiner Idee schon richtig geschrieben.
Jaja, manchmal geht mein Durchführungsdrang mit mir durch, und uch schreibe drauf los :rolleyes:.
Ja, ich denke auch eine Wordlist lohnt sich mehr, ich werde wohl ein Programm schreiben, welches die Passwörter aus der List in Hashes umwandelt und dann mit dem Hash abgleicht, das macht wohl mehr Sinn...
Jetzt fehlt bloß noch eine Wordlist ^^
 
Zurück
Oben