Erstes Skript: Brute Force für MD5-Hashes

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
DB_420
User
Beiträge: 2
Registriert: Donnerstag 19. April 2007, 15:55

Hallo,

ich bin jetzt schon länger programmierend tätig, erst in QBasic, dann VB.NET, anschließend C#; nun möchte ich mir Python zu Gemüte führen, es sieht ja sehr praktisch aus.

Hier mein erstes Skript: Es ist ein Brute-Force-Script für MD5-Hashes:

Code: Alles auswählen

import hashlib
import string
import time

def checkHash(targetHash,baseString,testRounds):
    changedBaseString = baseString
    for a in string.printable:
        changedBaseString = baseString
        changedBaseString += a
        temphash = hashlib.md5(changedBaseString).hexdigest()
        print "Teste:", changedBaseString,"/",temphash
        if temphash == targetHash:
            return changedBaseString
        else:
            if testRounds > 1:
                temp=checkHash(targetHash,changedBaseString,testRounds-1)
                if temp is not None:
                   return temp
                   
hash1 = raw_input("Bitte einen hexadezimalen MD5-Hash eingeben: ")
rounds = int(raw_input("Bitte geben sie die zu probierenden Stellenanzahl ein: "))
start = time.time()
temp = checkHash(hash1,"",rounds)
if temp is not None:
    print "Ihr Passwort ist: ", temp
else:
    print "Es wurde keine Uebereinstimmung gefunden - probieren sie es eventuell mit mehr Stellen!"
print "Rechenzeit: ", time.time()-start, "sec"

Gruß
Daniel
Zuletzt geändert von DB_420 am Dienstag 24. April 2007, 18:50, insgesamt 1-mal geändert.
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Hi!
Ich kenn hashlib jetzt nicht, desswegen kann ich da nicht viel zu sagen, aber in Zeile 17 und 26, das ´temp!=None´ ist etwas komisch. Ich würde in jedem Fall etwas zurückgeben(wird doch nicht, oder?) und dann ´if temp´ schreiben.
Außerdem kannst du dir beim nächsten Mal das Getippe für das ´alphabet´ sparen: Das Modul ´strin´ hat das nämlich in Konstanten schon gespeichert. Hier wär das, wenn ich das richtig sehe, ´ascii_lowercase´, ´ascii_uppercase´, ´digits´ und die Sonderzeichen, die du dann selbst dazuschreiben musst, das es nicht alle Zeichen aus ´punktuation´ sind.
Da du den zweiten raw_input nicht weiter testest, sondern direkt an ´int´ übergibst, könntest du direkt ´input´nehmen.
Schließlich könntest du auch den Teil von Zeile 6-18 in eine Schleife in der Funktion packen, anstatt diese rekursiv auszuführen.

Gruß, jj

(Ich hoffe, das ist nicht alles Quatsch)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

schlangenbeschwörer hat geschrieben:Da du den zweiten raw_input nicht weiter testest, sondern direkt an ´int´ übergibst, könntest du direkt ´input´nehmen.
Danger! ``input`` funktioniert wie ``exec raw_input`` und nicht wie ``int(raw_input)``.

Achja. Hallo Daniel, willkommen im Forum.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Leonidas hat geschrieben: Danger! ``input`` funktioniert wie ``exec raw_input`` und nicht wie ``int(raw_input)``.
Ja, stimmt.
Aber ist das nicht, solange der User es auf seinem eigenen Rechner laufen lässt, nicht egal? Wer einen anderen Befehl eingibt, der Schaden anrichten könnte, was das dann wohl, und wer sich die eigene Festplatte zerschießen will, sollte nicht daran gehindert werden. :wink:
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Aber wenn irgendwo steht "Gib eine Zahl ein", so erwarte ich, dass eine Fehlermeldung kommt, wenn ich "rm *" eingebe, und nicht, dass stillschweigend der Befehl ausgefuehrt wird, und ich mich hinterher wundere, was denn loss ist.

Wenn da jetzt stehen wuerde: "Welcher Befehl soll ausgefuehrt werden?", ist das natuerlich was anderes.
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Na gut...ihr hab ja Recht. War auch nicht so ganz erns gemeint, wobei es wohl recht unwahrscheinlich ist, dass man ausversehen einen solchen Befehl eingibt...
BlackJack

Ist mir noch nicht oft passiert, aber ich habe auch schonmal nachdem ich am Rechner unterbrochen wurde (Telefonanruf, Katze macht blödsinn, …) in ein falsches Fenster getippt. Einmal sogar mit etwas unangenehmeren Folgen weil das Heimatverzeichnis in dem ich Änderungen vorgenommen hatte, nicht das auf dem Rechner war, wo ich eigentlich etwas machen wollte, sondern lokal. Da war ich glücklich über ein vorhandenes Backup. :-)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BlackJack hat geschrieben:Ist mir noch nicht oft passiert, aber ich habe auch schonmal nachdem ich am Rechner unterbrochen wurde (Telefonanruf, Katze macht blödsinn, …) in ein falsches Fenster getippt.
Right, manchmal sieht man nicht auf den ersten Blick, ob ein Fenster lokal ist oder nicht. Aber wenigstens versuche ich nicht irgendwelche Sachen während des telefonierens am Computer zu machen (vor allem nicht tippen, klicken geht noch), weil dabei dann meist Blödsinn rauskommt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Leonidas hat geschrieben:Right, manchmal sieht man nicht auf den ersten Blick, ob ein Fenster lokal ist oder nicht.
Ja ja, erst gestern habe ich meinem Chef das Kennwort einer Remote-Desktopverbindung zugeschickt... :D
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Tipp: Auch Strings sind Sequenzen, daher kann man durch 'abc' ebenso iterieren wie durch ['a', 'b', 'c']. Zudem gibt es im Modul `string` einige Konstanten, die man verwenden kann.

Weiterhin wäre noch eine Prise PEP 8 sehr hilfreich (konkret: Leerzeichen nach Kommas sowie vor und nach binären Operatoren wie = oder +=)und auch die Namen der Parameter der Funktion lassen zu wünschen übrig ;)

Ob ein Objekt None ist, prüft man besser und schneller(?) mit dem Identitätsoperator 'is' anstelle von '!=' oder '=='.
DB_420
User
Beiträge: 2
Registriert: Donnerstag 19. April 2007, 15:55

Hallo,

vielen Dank für eure Tipps und die Aufnahme ins Forum :D

Ich habe eure Vorschläge mal eingearbeitet, das Resultat sieht man im ersten Beitrag.

Gruß
Daniel
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Rebecca hat geschrieben:Aber wenn irgendwo steht "Gib eine Zahl ein", so erwarte ich, dass eine Fehlermeldung kommt, wenn ich "rm *" eingebe, und nicht, dass stillschweigend der Befehl ausgefuehrt wird, und ich mich hinterher wundere, was denn loss ist.

Wenn da jetzt stehen wuerde: "Welcher Befehl soll ausgefuehrt werden?", ist das natuerlich was anderes.
Naja, um "rm /" mit input() auszuführen, muss man schon etwas kreativer sein... ;)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
BlackJack

Der Aufwand hält sich in Grenzen. :-)

Code: Alles auswählen

In [2]: input()
__import__('os').system('echo hallo')
hallo
Out[2]: 0
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Das meinte ich ja... `__import__` ist nicht gerade eines der bekanntesten Builtins.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Antworten