Kleiner Passwortgenerator in Perl

Aus der Reihe »Schnelles Kamel-Gehacktes« heute der Beitrag, wie man quick’n’dirty einen Passwortgenerator in Perl schreibt. Anforderungen vorher: 8 Zeichen, weil viele Linuxe sowieso dahinter abhacken; nur Zeichen, die in den ersten 7 Bit der ASCII-Tabelle stehen und dann auch nur welche, die man direkt oder mit Umschalttaste (Shift) eingeben kann, nichts wozu man AltGr oder ähnliches bräuchte. Dazu braucht man eine ASCII-Tabelle und dann geht’s los:

#!/usr/bin/perl -w
# $Id: gen_passwd.pl 111 2008-02-06 13:45:24Z alex $
use strict;

my @allowed_chars;
# ASCII von 0x21 bis 0x3f
# das sind die meisten Sonderzeichen und die Ziffern
for (my $i=0x21; $i<=0x3f; $i++) {
	push @allowed_chars, chr($i);
}

# ASCII von A bis Z
for (my $i=0x41; $i<=0x5a; $i++) {
	push @allowed_chars, chr($i);
}

# ASCII von a bis z
for (my $i=0x61; $i<=0x7a; $i++) {
	push @allowed_chars, chr($i);
}

push @allowed_chars, chr(0x5f); # '_'

my $char_count = scalar @allowed_chars;

for (my $i=0; $i<8; $i++) {
	print $allowed_chars[int rand $char_count];
}

print "\n";

Diese Passwörter eignen sich gut als initiale Passwörter für neue Nutzer. Die Nutzer sollten sodann aufgefordert werden, sich mit passwd ein neues zu setzen. Da so ein zufälliges Passwort mit Zahlen und Sonderzeichen sehr schwer zu merken ist, werden sie dieser Aufforderung sicher nachkommen.

12 thoughts on “Kleiner Passwortgenerator in Perl

  1. Peter

    Passwörter, die mit deutscher und englischer Tastaturbelegung die gleichen sind, wären noch interessant. Da gibt es ja doch ab und zu Probleme. Aber das nur am Rande. Lustige Sache.

    Reply
  2. LeSpocky

    Ich habe schon drauf geachtet, dass man keine Probleme mit der Kodierung bekommt, also dass man nicht in die Situation gerät auf einer englischen Tastatur z.B. ein ‘Ä’ eingeben zu müssen, deswegen die Beschränkung auf 7-Bit-ASCII.

    Wenn man jetzt noch alles ausschließen will, was nicht auf gleichen Tasten liegt, sieht’s schon finster aus. ‘z’ und ‘y’ fallen dann weg, weil die auf englischen und deutschen Tastaturen vertauscht sind und von den Sonderzeichen bleiben nur sehr wenige übrig: Punkt, Komma, Ausrufezeichen und vielleicht noch Dollar und Prozent. Kann man machen, aber dürfte nur in den seltensten Fällen relevant sein und dann darf man auch nicht noch anfangen französische oder noch andere Tastaturen zu berücksichtigen. ;)

    Reply
  3. LeSpocky

    Angestoßen von den Suchergebnissen, mit denen die Leute hier landen, hab ich gerade eine Diskussion bei rubyforen.de gelesen. Die Frage, wie gut derartig erzeugte Passwörter sind, ist durchaus interessant. Das obige Skript generiert grundsätzlich Passwörter mit acht Zeichen. Mehr sind für den angedachten Zweck, Passwörter für eisfair-1, zwecklos, weil das dort verwendete System bei Eingabe von passwd folgendes ausgibt:

    Password will be truncated to 8 characters

    Weniger Stellen vermindern gleich die Sicherheit, kommen also auch nicht in Frage. Angenommen, Perl generiert mit der Funktion rand saubere Zufallszahlen, dann bleiben von den theoretisch möglichen 256^8 = 2^64 möglichen Kombinationen abzüglich aller Steuer- und Sonderzeichen, die ich ausgeschlossen habe, noch 84^8 Kombinationen übrig. Das sind immerhin noch rund 2,48*10^15 Kombinationen und zur Basis 2 umgerechnet entspricht das 51 Bit.

    Dann hab ich mal kurz bei Wikipedia gesucht. Dort findet man unter Bruteforce die Angabe, dass aktuelle Rechner ungefähr 20 Millionen Kombinationen pro Sekunde durchprobieren können. Für einen kleinen Vergleich nehme ich einmal eine kleinere Schlüsselstärke von 40 Bit an und weiterhin eine, wo z.B. aus den 8 Bit der ISO8859-1-Kodierung alles außer die Steuerzeichen verwendet wird, das sind immerhin 62 Bit. Um alle (!) Kombinationen durchzurechnen, brauch man bei 40 Bit gerade mal 15,3 Stunden, bei 51 Bit sind es immerhin schon 1303 Tage. Das ließe sich mit ein wenig gekaufter verteilter Rechenpower noch in vertretbarer Zeit knacken, wenn man es will. Bei 62 Bit ist man allerdings schon bei etwa 7500 Jahren, wohl gemerkt alles auf Grundlage der 20 Millionen Kombinationen pro Sekunde mit heutiger Hardware.

    Schlussfolgerung: für wirklich wichtige Systeme sollte man den Login wohl nur noch über Keyfiles erlauben und das Einloggen per Passwort verbieten. So ein einfacher SSH-Key nach DSA oder RSA wird per Default erstmal mit 1024 Bit angelegt. Das ist schonmal eine andere Qualität. ;-)

    Reply
  4. Peter

    Mit dem Keylogin und der zugehörigen Sicherheit: Da kommen ja noch andere Dinge zum Tragen. Ein vernünftiges System erlaubt nur das “Probieren” von relativ wenigen Schlüsseln pro Zeiteinheit, sprich, nach dreimal falsch eingeben ist erstmal 10 Sekunden Pause, danach dreimal falsch, eine Minute Pause. Und so weiter. Und spätestens dann sollte sich das gehäufte Fehlverhalten in irgendwelchen Logfiles wiederfinden, bzw dem fleißigen Administrator eine eMail schreiben.

    Für den Server bei meinen Eltern erlaube ich grundsätzlich nur drei Versuche pro halbe Stunde und fühle mich damit eigentlich relativ sicher, auch mit Einloggen per Passwort ;)

    Reply
  5. Tux

    Ich schliesse mich Peter an: Die Sicherheit entsteht an dieser Stelle wieder dadurch, dass man eben nicht einfach probieren kann.

    Der oben beschriebene Brute-Force-Angriff beruht eher darauf, dass man das verschluesselte Passwort besitzt und das Verschluesselungsverfahren kennt. Deswegen muss der Admin genau darauf achten, dass eben diese Informationen (und da wir security by obscurity nicht moegen, die erstgenannte Information) nicht in die falschen Haende geraten.

    Auf alten Unix-Systemen gibt/gab es das Problem, dass die Passwoerter verschluesselt mit in der /etc/passwd abgelegt wurden, die ja jeder einsehen kann. Damit man an die Codes nicht mehr herandkommt, wurde unter die /ect/shadow eingefuehrt, die nur root sehen darf.

    Interessant finde ich noch, wie viele Systeme wirklich nur die ersten 8 Zeichen auswerten. Damit werden zum Einen laengere Passwoerter sinnlos, zum Anderen kann man aber Umstehende und Laien damit verwirren/beeindrucken, indem man einfach noch ein paar Zeichen mehr eingibt. Welche das sind, ist ja dann egal. ;)

    Reply
  6. Peter

    Und dann gibt es noch so “Leute” wie ebay, die bei Passwörter nichtmal nach Groß/klein-Schreibung unterscheiden …

    Reply
  7. LeSpocky

    Tatsache, eBay ist Groß-/Kleinschreibung egal. Haua, das wusste ich auch noch nicht, aber wenigstens erlauben die Passwörter mit mehr als acht Zeichen (und prüfen die auch).

    Reply
  8. Pingback:   Sicherheitslücken beim Studentenausweis der OvGU von antiblau blog

  9. Pingback:   Keys für Upgrade auf WordPress 2.6 von antiblau blog

  10. LeSpocky

    Geht natürlich alles noch kürzer, kennt man ja von Perl. Das Perl Kochbuch zeigt da eine schöne Möglichkeit:

    @chars = ( "A" .. "Z", "a" .. "z", 0 .. 9, qw(! @ $ % ^ & *) );
    $password= join("", @chars[ map { rand @chars } ( 1 .. 8 ) ]);
    

    Da fehlt natürlich noch bisschen drumrum, aber es ist eigentlich ähnlich gut verständlich und eben bedeutend kürzer. Cooles Buch. :D

    Reply
  11. Tux

    Dann kann man doch bestimmt auch noch die 8 durch einen Parameter fuer die Laenge setzen.

    Die Loesung ist auf jeden Fall Perl-ish – das Ganze in zwei Zeilen. :)

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *