12.112014

Einen Zufallsstring mit PHP erzeugen

Wenn man mit PHP einen Zufallsstring erzeugen möchte gibt es dafürsehrvieleMöglichkeiten. Das Problem ist, dass viele Code-Schnipsel die man im Internet findet für Passwörter nicht gut geeignet sind. Ich möchte heute deshalb mal über die meiner Meinung nach beste und einfachste Weise bloggen, wie man einen Zufallsstring in PHP erzeugt.

Eine häufig vorgeschlagene Lösung sieht so aus, dass man einen md5-Hash beschneidet. Wie zum Beispiel so:

function generateRandomString($length = 10) {
	substr(md5(time()), 0, $length);
}

Da ein md5-Hash aber nur aus Zahlen und (kleinen) Buchstaben von a-f besteht ist diese Lösung nicht gut geeignet für Passwörter. Ein gutes Passwort sollte ein möglichst hohen (potentiellen) Zeichenvorrat haben. Wenn ein Angreifer weiß, dass er sich auf wenige Zeichen beschränken kann, ist dies bereits ein Sicherheitsrisiko.

Daher gehe ich etwas anders vor. Zu erst generieren wir uns einen String der aus vielen Zeichen besteht. Das geht zum Beispiel so:

$alphabet = implode('', range('!', 'z'));

Die Funktion range gibt uns ein Array mit den (ASCII) Zeichen von ! bis z zurück. Das sind immerhin 90 Zeichen, aus denen unser Zufallsstring am Ende bestehen kann. Aus dem Array machen wir mit implode einen String. Wer keine Sonderzeichen möchte, oder allgemein die Zeichen festlegen möchte die für den Zufallsstring benutzt werden kann auch eine feste Zeichenkette angeben:

$alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

Damit Zeichen mehrmals vorkommen können benutzen wir str_repeat. Anschließend wir der String mit str_shuffle geshuffelt und schlussendlich auf die gewünschte Anzahl Zeichen mit substr beschnitten. Das Endergebnis (als Funktion) sieht dann so aus:

/**
 * Generates a random string with $length characters
 *
 * @param int $length Length of the string (optional)
 * @return string
 */
function generateRandomString($length = 10) {
	return substr(str_shuffle(str_repeat(implode('', range('!','z')), $length)), 0, $length);
}

echo generateRandomString(8); // for example: 1m*_6Um3

Wer also nach einem PHP One-Liner gesucht hat, der einen Zufallsstring erzeugt, der sollte mit dieser Funktion glücklich werden. Außerdem erzeugt dieser Code relativ "gute" Zufallszeichenketten, da ein hoher Zeichenvorrat sicher gestellt ist und jedes Zeichen mehrmals vorkommen kann.