Wie programmiere ich einen password cracker?
Hallöchen, ich soll momentan eine Facharbeit schreiben über Passwortsicherheit (falls jetzt jemand sagt dass ich mir doch was anderes aussuchen hätten soll dann sry aber ich hab das thema vorgeschrieben bekommen) und mein Fachlehrer gab mir die Aufgabe einen Password cracker zu programmieren... Ich habe nur leider keine Erfahrungen im Programmieren.
Es soll halt durch Zufallsprinzip ein gewisses Passwort suchen wie bei Brute force angriffen. Dabei soll es aber angeben wie lange es dauert (also Zeit und wie viele programdurchläufe es braucht) um das richtige Password zu bekommen... Daraus soll ich dann eine Statistik erstellen und das Programm erklären...
Kann mir vielleicht jemand dabei helfen oder einen kleinen Tipp geben? Ich bin wirklich total ratlos :( Ich bedanke mich schonmal für jede Hilfe. LG Melina
4 Antworten
Naja, im Endeffekt macht heute quasi kaum jemand noch Brute Force Attacken - und wenn dann auf GPUs, weil die einfach viel schneller rechnen als CPUs, aber ich würde einfach das Problem vereinfachen und würde zum einen die Passwortlänge z.B. auf genau 4 Zeichen begrenzen und sagen, es kommen nur Kleinbuchstaben ohne Umlaute vor. Ohne eine solche Beschränkung wirst Du kein Programm schreiben können, welches in überschaubarer Zeit fertig wird.
Dann hast Du pro Stelle 26 Möglichkeiten. Das ist relativ überschaubar und Du musst einfach nur ein Programm schreiben, welches alle Kombinationen probiert, bis es die richtige findet. Beispiel (Pseudo-Java - so in etwa könnte das aussehen):
string buchstaben = "abcdefghijklmnopqrstuvwxyz";
int[] stellen = new int[4];
for (int s1 = 0; s1 < buchstaben.length; s1++) {
stellen[0] = s1;
for (int s2 = 0; s2 < buchstaben.length; s2++) {
stellen[1] = s2;
for (int s3 = 0; s3 < buchstaben.length; s3++) {
stellen[2] = s3;
for (int s4 = 0; s4 < buchstaben.length; s4++) {
stellen[3] = s4;
string passwort = buchstaben[stellen[0]] +
buchstaben[stellen[1]] +
buchstaben[stellen[2]] +
buchstaben[stellen[3]];
if (zufälligesKennwort == passwort) {
System.out.println("Kennwort gefunden: " + passwort);
return;
}
}
}
}
}
System.out.println("Kennwort nicht gefunden!");
Das macht nichts anderes, als alle Kombinationen auszuprobieren, indem es hinten anfängt, Stellen zu tauschen. Es prüft also "aaaa", "aaab", "aaac", ..., "aaba", "aabb", ... "zzzz".
Wenn Du davon die Zeit misst, weißt Du halt, wie lange das dauert. Wenn Du jetzt noch eine Stelle (und damit eine Schleife) dazunimmst, kannst Du wieder die Zeit messen und wirst feststellen, dass der Aufwand überproportional steigt.
Das obige kann man auch noch eleganter ohne die 4 Schleifen machen und dann auch gleich so, dass die Länge des Passworts vorgegeben werden kann, aber für das Verständnis ist das obige vermutlich einfacher.
Wenn du nicht programmieren kannst ist das natürlich schwierig.
An sich ist das aber ganz einfach im Pseudocode:
Password password;
size_t iterations = 0;
Time start_time = Time::now();
do{
password = generateRandomPassword();
iterations++;
}while(checkPassword(password));
Time end_time = Time::now();
print("Password is ", password, " and was found after ", iterations, " iterations in ", (end_time-start_time).as_milliseconds(), " ms.");
Bzw. am besten gibt du das irgendwie strukturiert aus, sodass du das dann verwenden kannst um eine Statistik zu erstellen.
Die Methode "checkPassword" wird davon abhängen wie du das Password prüfen möchtest.
Die Methode "generateRandomPassword" wird davon abhängen wie du Brute Force machen möchtest (e.g. Wörterbuchattacke oder komplett zufällig, evtl. mit Längenbegrenzung, ...)
Hallo. Du hast es doch eigentlich schon skizziert. Denke mal die Algorithmen müssen nicht sonderlich ausgefuchst sein. Fang doch einfach mal einfach an, mit einem bestimmten Zeichenvorrat und einer maximalen Zeichenkettenlänge.
Letztlich kommt wohl bei raus, dass es ziemlich viele Kombinationen gibt. :)
Also wenn du nur Random irgendwelche Passwörter versuchst wirst du auch bei einem einfachen Passwort wie 1234 mehrere Tage benötigen...
Du musst also hier irgendwie die Auswahl beschränken. Also wenn du zB sagst du hast Passwörter in der Länge von 3 bis 6 Zeichen gehts schneller. Generell wirds einfacher je mehr Infos du vorher hast.
Vielen vielen Dank. Das hat mir schon sehr viel weiter geholfen (;