Zufallspasswort-Generator mit PHP:
In diesem Tutorial geht es um die Erstellung von Zufallpasswörtern.
Inhalt:
Grundlagen
Immer wieder braucht man schnell ein Passwort, das ausreichend sicher ist. Sicherheit bedeutet, dass man es nicht erraten kann. Der Name eurer Freundin ist ebenso schlecht als Passwort geeignet wie der eures Haustieres.
Sicherheit kann man gewinnen, indem man das Passwort nicht mehrfach verwendet und möglichst viele Kombinationen zulässt. Mit zunehmender Länge steigt aber auch die Gefahr, dass man sich vertippt.
Damit die Passwörter nicht immer ein asdf oder test beinhalten, wenn ihr sie selbst tippt könnt ihr ab sofort mit diesem Passwort-Generator sicherere Passwörter erstellen.
Die Funktion kann aber ebenso gut auch in die eigene Anwendung integriert werden, was gelegentlich notwendig ist.
Mehr zu sicheren Passwörtern hier.
sichere Passwörter per Generator erstellen
Die Anwendung der Funktion soll letztlich so sein, dass die Passwortlänge vorgegeben werden kann (aber nicht muss) und Sonderzeichen sowie Großbuchstaben optional deaktivierbar sind.
Die Funktion soll daher wie folgt aufgerufen werden können:
PHP-Code:
echo CreatePassword();
oder, um eine definierte Länge zu erhalten:
PHP-Code:
$length = 10
echo CreatePassword($length);
Damit Sonderzeichen und Großbuchstaben wie erwähnt genutzt werden können:
PHP-Code:
$length = 0
$capitals = true
$specialSigns = true
echo CreatePassword($length , $capitals , $specialSigns);
Nun fehlt nur noch die Innerei - die Funktion selbst.
So der prinzipielle Aufbau:
PHP-Code:
function CreatePassword($length = 7, $capitals = true, $specialSigns = true)
{
// ...
return $passwort;
}
Ein 0 Zeichen langes Passwort macht natürlich keinen Sinn, also beginne ich mit einer Überprüfung der übergebenen Länge:
PHP-Code:
if($length < 8)
$length = mt_rand(8,20);
hier wird also die Länge geprüft, und wenn sie zufällig lang sein soll, dann wird das Passwort zwischen 8 und 20 Zeichen lang. Natürlich könnt ihr die Länge ändern, jedoch bin ich der Meinung, dass es mindestens acht Zeichen haben sollte und mehr als 20 Zeichen hält eh keiner aus richtig zu tippen :)
Letzlich soll aus einem array() zufällig der eine oder andere Wert rausgepickt werden.
Damit das geschehen kann, muss das array vorher 'gefüllt' werden.
Kleine Buchstaben und Zahlen sind immer mit drin, darum werden sie in das array geschrieben:
PHP-Code:
$array = array();
# Zahlen
for($i=48;$i<58;$i++)
$array[] = chr($i);
# kleine Buchstaben
for($i=97;$i<122;$i++)
$array[] = chr($i);
hierbei bediene ich mich der Funktion chr, die ein Zeichen aus dem ASCII-Zeichensatz nimmt.
Welche zur Verfügung stehen lässt sich leicht ermitteln, indem man eine for-Schleife nimmt und einige Werte ausgibt.
Weiter geht es mit den Großbuchstaben. Wenn diese gewünscht werden, so werden sie ins array geschrieben. Es muss also eine Überprüfung stattfinden, ob der entsprechende Wert der Funktion übergeben wurde.
PHP-Code:
# Großbuchstaben
if($capitals)
for($i=65;$i<90;$i++)
$array[] = chr($i);
Selbiges geschieht für die Sonderzeichen, die in der ASCII-Tabelle jedoch ein wenig verstreut wurden, weshalb hier mehrere Zeilen benötigt werden.
PHP-Code:
# Sonderzeichen:
if($specialSigns)
{
for($i=33;$i<47;$i++)
$array[] = chr($i);
for($i=59;$i<64;$i++)
$array[] = chr($i);
for($i=91;$i<96;$i++)
$array[] = chr($i);
for($i=123;$i<126;$i++)
$array[] = chr($i);
}
Nun ist das array gefüllt und wartet nur noch darauf, dass wir Werte daraus auslesen.
Die Funktion mt_srand sorgt dafür, dass ein interner Startwert für den Zufallsgenerator mt_rand festgelegt wird.
Das Handbuch schreibt dazu:
Gleiche Startwerte führen auch jeweils zu derselben Pseudo-Zufallssequenzen daher ist es üblich, diese über die aktuelle Uhrzeit festzulegen
Das sieht dann wie folgt aus:
PHP-Code:
mt_srand((double)microtime()*1000000);
Nun muss noch der Rückgabewert definiert werden. Da wir in einer Schleife einzelne Zeichen an den späteren Rückgabewert anhängen, sollten wir vorher sicherstellen, dass dieser leer ist:
PHP-Code:
$passwort = '';
So - und nun zum Herzstück.
Die Funktion mt_rand wird dafür benutzt.
Die Funktion liefert eine Zahl im Bereich 'von bis'.
Als Startwert wird das erste Zeichen des arrays genommen - als letztes mögliche Zeichen soll das letzte Zeichen genommen werden. Die Anzahl der Zeichen kann mittels count ermittelt werden. Da das Zählen des array aber mit 0 beginnt, muss genau ein Wert abgezogen werden.
PHP-Code:
mt_rand(0, count($array)-1)
Darüber wird nun eine Zahl erhalten, die wir benutzen können, um genau ein Zeichen aus dem array anzusprechen. Daher wähle ich folgendes:
PHP-Code:
$array[mt_rand(0, count($array)-1)]
das wird lediglich an das Passwort angehängt:
PHP-Code:
$passwort .= $array[mt_rand(0, count($array)-1)];
und das geschieht mehrfach - dafür bietet sich die for-Schleife an. In Anhängigkeit der Länge, die das Passwort letztlich haben soll:
PHP-Code:
for ($i=1; $i<=$length; $i++)
{
$rnd = mt_rand( 0, count($array)-1 );
$passwort .= $array[$rnd];
}
So - und im ganzen sieht das dann so aus:
PHP-Code:
<?php
/*
* @param integer $length
* @param boolean $capitals
* @param boolean $specialSigns
*
* @return string
*/
function CreatePassword($length = 7, $capitals = true, $specialSigns = true)
{
$array = array();
if($length < 8)
$length = mt_rand(8,20);
# Zahlen
for($i=48;$i<58;$i++)
$array[] = chr($i);
# kleine Buchstaben
for($i=97;$i<122;$i++)
$array[] = chr($i);
# Großbuchstaben
if($capitals )
for($i=65;$i<90;$i++)
$array[] = chr($i);
# Sonderzeichen:
if($specialSigns)
{
for($i=33;$i<47;$i++)
$array[] = chr($i);
for($i=59;$i<64;$i++)
$array[] = chr($i);
for($i=91;$i<96;$i++)
$array[] = chr($i);
for($i=123;$i<126;$i++)
$array[] = chr($i);
}
mt_srand((double)microtime()*1000000);
$passwort = '';
for ($i=1; $i<=$length; $i++)
{
$rnd = mt_rand( 0, count($array)-1 );
$passwort .= $array[$rnd];
}
return $passwort;
}
?>
Und wie die Funktion aufgerufen werden kann habt ihr bereits oben gelesen, allerdings solltet ihr dann einen Blick auf die Funktion htmlspecialchars werfen, andernfalls könnte es Probleme mit der Ausgabe geben, da einige Sonderzeichen auch in HTML Verwendung finden.
PHP-Code:
<?php
echo htmlspecialchars(CreatePassword());
?>
Wer die Funktion nur mal eben schnell nutzen will, der kann das hier tun.
mnemonische Passwörter per Generator erstellen
Gelegentlich braucht man auch Zufallspasswörter, die leicht merkbar sind. Dabei helfen mnemonische Passwörter.
Anmerkung: das schränkt die Möglichkeiten der erstellten Passwörter - und damit letztlich auch die Sicherheit ein!
Der etwas dürftige Wikipedida-Artikel definiert wie folgt:

Zitat von
http://de.wikipedia.org/wiki/Mnemonik Die Mnemonik oder Mnemotechnik ist die Gedächtniskunst, also Regeln, Kniffe und Tricks, das Erinnerungsvermögen zu unterstützen und leistungsfähiger zu machen. Eine bekannte mnemonische Technik ist die der Eselsbrücken.
Der Aufbau der Passwörter wurde von mir in der Form gewählt, dass immer ein Pärchen aus 2 Buchstaben und letzlich eine wählbare Anzahl von Zahlen gebildet wird.
Da Bezeichnungen und Namen, wenn sie leicht zu merken sind auch 'mnemonische Begriffe' genannt werden, habe ich die Funktion entsprechend genannt.
Aufgerufen werden soll die Funktion dann mit zwei Parametern:
1) der Anzahl der Buchstaben-Pärchen
2) der Anzahl der angehängten Zahlen
PHP-Code:
<?php
/*
* @param integer $lenght
* @param integer $digits
*
* @return string $password
*/
function mnemonischesPasswort($lenght = 3, $digits = 0)
{
// ...
RETURN $password;
}
?>
Um anschließend etwas 'aussprechbares' zu erhalten, werden bei den Buchtaben-Pärchen stets Vokale (im weiteren Sinn) und Konsonanten (im weiteren Sinn) gepaart.
Im weiteren Sinn - damit meine ich, dass das y zu den Vokalen, was sprachlich nicht ganz korrekt, hier aber dienlich ist. Bei den Konsonanten habe ich auf das Q und das q verzichtet.
Im Gegensatz zur oben vorgestellten Methode sammel ich nun alle Zeichen in jeweils einem string.
PHP-Code:
<?php
/*
* @param integer $lenght
* @param integer $digits
*
* @return string $password
*/
function mnemonischesPasswort($lenght = 3, $digits = 0)
{
// Variablen definieren
$consonant = "bcdfghjklmnprstvwxzBCDFGHJKLMNPRSTVWXZ";
$vowels = "aeiouyAEIUY";
$password = '';
// ...
RETURN $password;
}
?>
Ein einzelnen Zeichen aus einem string zu selektieren - das geht mit der Funktion substr und den entspr. Parametern.
In der obigen Funktion wurde count verwendet, um zu ermitteln, wieviele Zeichen genutzt werden können. Bei einem string gilt es dafür die Funktion strlen zu benutzen.
PHP-Code:
$password .= substr($vowels, mt_rand(0, strlen($vowels)-1), 1);
Das restliche Prinzip ist so, wie bei der oben vorgestellten Funktion:
- Zeichenvorat anlegen
- Zufallsfunktion nutzen um einzelne Zeichen aneinander zu reihen
- generiertes Passwort mittels RETURN zurückgeben
Im Gesamten sieht das dann so aus:
PHP-Code:
<?php
/*
* @param integer $lenght
* @param integer $digits
*
* @return string $password
*/
function mnemonischesPasswort($lenght = 3, $digits = 0)
{
// Variablen definieren
$consonant = "bcdfghjklmnprstvwxzBCDFGHJKLMNPRSTVWXZ";
$vowels = "aeiouyAEIUY";
$password = '';
mt_srand((double)microtime()*1000000);
// Vokal/Konsonant-Paare erzeugen
for($i = 1; $i <= $lenght; $i++)
{
$password .= substr($consonant, mt_rand(0, strlen($consonant)-1), 1);
$password .= substr($vowels, mt_rand(0, strlen($vowels)-1), 1);
}
// Zahlen anhängen
for($i = 1; $i <= $digits; $i++)
$password .= mt_rand(0, 9);
RETURN $password;
}
?>
Während der Arbeit zu diesem Tutorial wurde ich auf eine andere Möglichkeit aufmerksam gemacht Passwörter zu erzeugen, für die jedoch gilt, dass sie einen eingeschränkten Zeichensatz haben - und man sie sich auch nicht unbedingt merken kann.
PHP-Code:
<?php
$password = substr(md5(time()), 10, 10);
?>
Jetzt solltet Ihr eigentlich in der Lage sein, einen Passwortgenerator ohne Vorlage nachzuprogrammieren. Die verwendeten Funktionen findet Ihr alle im PHP-Manual.
Solltet Ihr Fragen zu dem Tutorial haben, so schreibt bitte einen Beitrag im PHP-Forum mit einem Verweis auf dieses Tutorial.
Danke.
Ich hoffe, dass ich Euch hier etwas weiterhelfen konnte.
Grüße Jann Hendrik
Lesezeichen