IT-Academy Logo
Sign Up Login Help
Home - Programmieren - PHP - PHP: Zufallspasswörter erstellen



PHP: Zufallspasswörter erstellen

Zufallspasswörter werden oft erstellt um Spammern und Fake-Accounts entgegen zu wirken. Dieser Artikel präsentiert ein ebenso fertiges wie erweiterbares Skript zu diesem Thema.


Autor: Patrick Faes (dreamer)
Datum: 01-11-2006, 12:19:25
Referenzen: siehe Text
Schwierigkeit: Fortgeschrittene
Ansichten: 6275x
Rating: 9 (1x bewertet)

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



1. Einführung

Spammern und Erstellern von massenhaft Fake-Accounts sind Seitenbetreibern schon länger ein Dorn im Auge. Eine Methode um diese das Leben, bzw. das Spammen schwerer zu machen, ist die Erstellung von Zufallspasswörter. Fake-Accounts werden (z.B. in Foren) oft massenhaft erstellt mit automatisierte Programme die sich einfach bei einem Forum anmelden und dann irgendwelche Werbung oder Unsinn posten. Wenn jemand (oder ein Programm) sich beim Registrieren kein eigenes Passwort wählen kann, sondern dies vom Server per Zufall generiert wird, kann diese Person (oder Programm) sich nicht ohne weiteres anmelden.

Dieser Artikel zeigt ein fertiges Skript dass zu diesen Zweck verwendet werden kann. Zuerst wird die theoretische Arbeitsweise erklärt, wonach der eigentliche Programmcode analysiert wird. Zum Schluß folgt noch ein Abschnitt zu der Implementierung des Skripts.


2. Die Theorie

Die Frage die sich stellt bei der Implementierung eines Passwortgenerators ist, wie das Resultat denn ungefähr aussehen soll. Ein Computer weiß ja leider nicht von selbst was einer sich wünscht. Um ein gewünschtes Resultat zu erreichen, braucht ein Programm folgende Daten:
  • die minimale Länge des Passwortes
  • die maximale Länge des Passwortes
  • welchen Zeichen in einem Passwort vorkommen (können)
Eine weitere Frage ist, wie ein Programm denn aus einer Reihe von Zeichen selbst einige davon auswählt und so ein Passwort erstellt. Das Programm bestimmt die Länge des Passwortes (wobei die angegebene Minimal- und Maximallängen berücksichtigt werden) und nimmt dann soviele Male ein Zeichen aus dieser Reihe, wobei per Zufall bestimmt wird welches Zeichen aus dieser Reihe genommen wird. Die Zusammensetzung dieser Zeichen bildet dann das Passwort.


3. Das Skript

3.1. Die zu verwendene Zeichen bestimmen

Lasst uns jetzt mal die Praxis angehen. Zuerst bestimmen wir welche Zeichen im Passwort vorkommen können. Die simpelste Weise dies zu erreichen, ist es ein Array zu erstellen.
$zeichen = array(
	'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
	'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
	's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
	);
Die zu verwendene Zeichen auf diese Weise anzugeben, ist jedoch sehr umständlich. Eine vernünftigere Methode ist da die Funktion range() zu verwenden. Diese erstellt automatisch ein Array mit einer Reihe von Zeichen, wobei sich die Funktion basiert auf einer Start- und Endindex, die logisch (alfabetisch oder numerisch) einander folgen. (In wirklichkeit basiert dies auf Zeichentabellen, wie z.B. die ASCII-Tabelle.)
$zeichen = range('a' , 'z');
Aber was wenn Sie nun noch mehr Zeichen verwenden wollen? Dazu können Sie mehrere Reihen von Zeichen erstellen und diese zusammen fügen mit der Funktion array_merge().
$reihe1 = range('a' , 'z');
$reihe2 = range(0 , 9);

$zeichen = array_merge($reihe1 , $reihe2);
Diese Methode erreicht sein Ziel zwar, aber wenn Sie sich nachher dazu entscheiden einer der Reihen heraus zu nehmen, müssen Sie diese aber doppelt entfernen: einmal die $reihe-Variable, und auch die Zusammensetzung in der Variable $zeichen mit der Funktion array_merge().

Daher werden wir die einzelne Reihen zusammen in einem Array setzen und diese dann in einer for-Schleife zusammenfügen. Die einzelne Reihen werden zuerst an einem Array $reihen hinzugefügt mit der Funktion array_push().
$reihen = array();
array_push($reihen , range('a' , 'z') );
array_push($reihen , range('A' , 'Z') );
array_push($reihen , range(0 , 9) );
Wie schon gesagt verwenden wir dann die Funktion array_merge() in einer for-Schleife um die einzelnen Arrays an einem anderen Array $zeichen hinzuzufügen.
$zeichen = array();

for ($i = 0 ; $i < count($reihen) ; $i++)
	$zeichen = array_merge($zeichen , $reihen[$i]);
Sie haben jetzt Ihre Reihe von Zeichen aus denen dass Passwort generiert werden soll. Wie schon gesagt, werden die Zeichen zufälligerweise aus diese Reihe gewählt. Um das Zufall noch zu erhöhen, werden wir das Array das die Zeichen enthält durch einander wirbeln, wodurch die Array-Elemente nicht mehr in einer logischen (alfabetischen oder numerischen) Reihenfolge stehen. Dazu verwenden wir die Funktion shuffle(). Der Effekt wird noch vergrößert wenn wir diesen Vorgang mehrere Male wiederholen.
//das Array wird so oft durchgewirbelt
//wie in der Variable $durchwirbeln_n angegeben

$durchwirbeln_n = 3;

for ($i = 0 ; $i < $durchwirbeln_n ; $i++)
	shuffle($zeichen);
Jetzt haben Sie Ihre Reihe von Zeichen aus denen das Passwort erstellt werden soll. Beachten Sie dass mit der Funktion range() ein Element nur einmal in der Reihe aufgenommen wird. Wenn Sie erreichen möchten dass ein bestimmtes Zeichen öfter vorkommt, können Sie diese noch einzeln hinzufügen mit array() oder array_fill().

Sie können eventuell auch andere Zeichen wie z.B. [ { - _ hinzufügen. Beachten Sie dabei dass dies bei Passwörtern nicht sehr beliebt ist. Zudem könnten Sie dieses Skript auch dazu verwenden Dateien unter einen zufallsgenerierten Namen zu speichern. Dabei müssen aber die Regeln in Bezug zur Namensgebung beachtet werden: die Dateinamen dürfen nicht mit einer Ziffer anfangen, dürfen keine Spezialzeichen enthalten und brauchen ihre eigene Datei-Endung. Das erste Problem können Sie einfach lösen indem Sie den Namen einen Unterstrich ( _ ) voransetzen.


3.2. Die Länge des Passwortes bestimmen

Die Länge des Passwortes lässt sich ganz einfach bestimmen. Sie geben einfach die minimale und maximale Länge an.
$minimale_laenge = 6;
$maximale_laenge = 9;
Danach wird das Skript mit der Funktion rand() die exacte Passwortlänge bestimmen.
$laenge = rand($minimale_laenge , $maximale_laenge);
In diesem Beispiel wird das Passwort also 6 bis 9 Zeichen lang sein. Natürlich können Sie die Passwortlänge auch exact festlegen.
$laenge = 8;


3.3. Das Passwort generieren

Nachdem wir jetzt bestimmt haben welche Zeichen im Passwort vorkommen können und auch die Länge des Passwortes festgelegt haben, ist es an der Zeit das zu machen worum es eigentlich geht nämlich ein Passwort generieren.

Wie schon gesagt, werden wir in einer Schleife soviele Zeichen auswählen wie es in der Variable $laenge festgelegt ist. Das Zeichen wird dann jeweils dem Passwort hinzugefügt.
$passwort = '';

for ($i = 0 ; $i < $laenge ; $i++)
	$passwort .= $zeichen[array_rand($zeichen , 1)];
Zu diesem Zweck verwenden wir die Funktion array_rand(), welche per Zufall ein Element aus einem Array wählt. Dabei muss aber beachtet werden dass diese Funktion die Index des Array-Elements zurückgibt und nicht den eigentlichen Wert. Daher die Notation:
$zeichen[array_rand($zeichen , 1)];
Die Funktion array_rand() liefert den Index und diese wird dann sofort verwendet um den Wert zu bekommen, welcher dann dem Passwort (gespeichert in der Variable $passwort) hinzugefügt wird.

Im Prinzip könnten Sie auch verhindern dass ein einzelnes Zeichen mehrfach im Passwort vorkommt indem Sie die Funktion unset() verwenden um ein Array-Element zu löschen. Sie könnten auch die Zeichen jeweils einem anderen Array hinzufügen, hiermit noch etwas anstellen und diese dann mit der Funktion implode() zusammensetzen.


4. Implementierung

Bisher haben wir nur gesehen wie das Skript funktioniert, jedoch wurde versprochen dass es sich um ein fertiges Skript handelt das sofort einsetzbar ist. Und das geht sehr leicht. Stellen Sie zuerst folgende Funktion in Ihrem PHP-Code:
function passwort_generieren($_min_laenge, $_max_laenge, $_reihen, $_durchwirbn_n)
{
	$zeichen = array();
	foreach($_reihen as $reihe)
		$zeichen = array_merge($zeichen, $reihe);
	for ($i = 0 ; $i < $_durchwirbeln_n ; $i++)
		shuffle($zeichen);

	$passwort = '';
	$laenge = rand($_min_laenge , $_max_laenge);
	for ($i = 0 ; $i < $laenge ; $i++)
		$passwort .= $zeichen[array_rand($zeichen , 1)];

	return $passwort;
}
Jetzt erstellen Sie noch kurz die Daten aus denen ein Passwort erstellt werden soll:
//$reihen:
//muss ein Array aus Arrays (mindestens einem) sein
$reihen = array();
array_push($reihen, range('A' , 'Z'));
array_push($reihen, range('a' , 'z'));
array_push($reihen, range(0 , 9));

//bestimmen die minimale und maximale Länge des Passwortes
$min_laenge = 8;
$max_laenge = 11;

//bestimmt wie oft die Zeichenreihen durch einander
//gewirbelt werden sollen
// -> erhöht den Zufallseffekt
$durchwirbeln_n = 3;
Die Daten übergeben Sie der Funktion passwort_generieren().
$passwort = passwort_generieren($min_laenge, $max_laenge, $reihen, $durchwirbeln_n);
Und schon haben Sie Ihr neues Passwort dann in der Variable $passwort gespeichert ist.


dreamer
Expert
Beitrag vom:
14-08-2010, 16:14:04

@ fridojet:

Die Funktion Shuffle() würfelt alle Elemente eines Arrays durcheinander und diese Elemente finden sich dann an willkürlicher Stelle zurück. Ein Computer kennt aber kein Zufall im eigentlichen Sinne, sondern nur Logik und orientiert sich an seine Uhr, bzw. die Anzahl der Millisekunden die vergangen sind seid der Computer hochgefahren wurde. Ich vermute deshalb dass mehrfaches durchwürfeln eines Arrays die Trefferquote eines Hackers erheblich verringert. (Aber warscheinlich kennen diese Typen bessere Tricks als auf gut Glück eine Zeichenkombination zu testen.)

Die Funktion Rand() nimmt übrigens ein willkürliches Element eines Arrays.

-----------------------------------------------------


fridojet
Rookie
Beitrag vom:
14-08-2010, 14:55:41

Verwendungsgrund für Shuffle

Sie schrieben, \"der Effekt\" werde \"noch vergrößert\". In meinen Codes habe ich bei der Benutzung von Shuffle immer nur einen einzigen Aufruf vorgenommen - aber darüber habe ich mir eigentlich nie viele Gedanken gemacht. Ich nahm immer an, PHP wird das Array schon \"genug\" zufällig anordnen - liege ich falsch? Gibt es irgendwo nähere Informationen dazu? Warum verwenden Sie mehrfach Shuffle und zusätzlich eine Randfunktion und wie sind Sie auf diese Idee gekommen? Danke für nähere Informationen.

-----------------------------------------------------
fridojet. Ein Mann kauft ein Auto. Seine Frau hat blondes Haar.


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04508
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06246
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1154
Comments: 0