PHP Zufallsstring Generator: Funktionsweise & Sicherheit

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

PHP Zufallsstring Generator: Wie funktioniert er wirklich?

\n\n

Jeder Entwickler stand schon einmal vor der Aufgabe: einen zufälligen String generieren. Für Tokens, temporäre Passwörter, Session-IDs oder einfach für Testdaten. PHP bietet ein Dutzend Möglichkeiten, aber welche ist die richtige? Und vor allem – warum?

\n\n

Auf Stack Overflow hat die Frage „PHP random string generator“ tausende Aufrufe und hunderte Antworten. Die meisten davon sind jedoch fertige Code-Schnipsel ohne Erklärung. Heute schauen wir unter die Motorhaube von PHP und verstehen, wie Zufallsstring-Generatoren wirklich arbeiten, worin sich rand() von random_int() unterscheidet und warum Ihr „zufälliges“ Passwort alles andere als zufällig sein könnte.

\n\n

Was bedeutet „Zufall“ in PHP?

\n\n

In der Programmierung gibt es zwei Arten von Zufall: Pseudozufall und kryptografisch sicheren Zufall. Der Unterschied ist wie der zwischen einem echten Würfel und einem vorhersagbaren Taschenrechner.

\n\n

Pseudozufallszahlen (PRNG) werden von einem Algorithmus basierend auf einem Startwert (Seed) erzeugt. Wenn Sie den Seed kennen, kennen Sie die gesamte Sequenz. Für einfache Aufgaben (Farbrandomisierung im Design, Testdaten) reicht das aus. Aber für Authentifizierungs-Tokens und Passwörter ist das eine Katastrophe.

\n\n

PHP bietet mehrere Funktionen, jede mit einem anderen Grad an „Zufälligkeit“:

\n\n
    \n
  • rand() – klassischer PRNG, schnell, aber vorhersagbar
  • \n
  • mt_rand() – verbesserter Mersenne-Twister-Algorithmus, schneller und mit längerer Periode
  • \n
  • random_int() und random_bytes() – kryptografisch sichere Generatoren (PHP 7+)
  • \n
  • openssl_random_pseudo_bytes() – eine weitere kryptografisch sichere Option
  • \n
\n\n

Wie funktioniert das beliebteste Code-Snippet?

\n\n

Hier ist der klassische Code, der durchs Internet geistert:

\n\n
<?php\nfunction generateRandomString($length = 10) {\n    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n    $charactersLength = strlen($characters);\n    $randomString = '';\n    for ($i = 0; $i < $length; $i++) {\n        $randomString .= $characters[rand(0, $charactersLength - 1)];\n    }\n    return $randomString;\n}\n?>
\n\n

Auf den ersten Blick erscheint alles logisch. Wir nehmen einen String mit Zeichen, wählen zufällig einen Index aus und wiederholen den Vorgang. Aber schauen wir uns genauer an, was hier wirklich passiert.

\n\n

Problem Nr. 1: rand() und sein Seed

\n\n

Die Funktion rand() verwendet in PHP standardmäßig den Linear Congruential Generator (LCG). Dies ist eine der ältesten und vorhersagbarsten Methoden. Wenn Sie srand() nicht mit einem zufälligen Seed aufrufen, initialisiert PHP den Generator automatisch mit der aktuellen Zeit (in Mikrosekunden).

\n\n

Kennt ein Angreifer die genaue Startzeit des Skripts (z. B. aus Server-Logs), kann er die gesamte Sequenz von rand() reproduzieren. Bei einem Token zur Passwortzurücksetzung ist das der direkte Weg zum Hack.

\n\n

Problem Nr. 2: Wahrscheinlichkeitsverschiebung (Bias)

\n\n

Auch wenn wir die Sicherheit außer Acht lassen, gibt es ein mathematisches Problem. Stellen Sie sich vor, rand(0, 61) (62 Zeichen im String). PHP verwendet intern einen Bereich von 0 bis getrandmax() (normalerweise 2147483647). 2147483647 ist nicht ohne Rest durch 62 teilbar. Der Rest der Division beträgt 31. Das bedeutet, dass die ersten 31 Zahlen des Bereichs eine etwas höhere Wahrscheinlichkeit haben, gezogen zu werden, als die restlichen.

\n\n

In der Praxis ist der Unterschied minimal, aber wenn Sie einen gleichmäßig verteilten Zufallsstring benötigen, ist rand() nicht die beste Wahl. random_int() löst dieses Problem, indem es einen Algorithmus verwendet, der eine gleichmäßige Verteilung garantiert.

\n\n

Kryptografisch sicherer Generator: Was steckt dahinter?

\n\n

Mit PHP 7 wurden die Funktionen random_int() und random_bytes() eingeführt. Sie nutzen die systemeigene Entropiequelle:

\n\n
    \

Blogs

Buchempfehlungen