Signatur
Beschreibung
Random\Engine\Secure ist eine Engine aus dem Random-Namespace (eingeführt in PHP 8.2), die intern auf die sichersten Zufallsquellen des jeweiligen Betriebssystems zurückgreift – auf Unix-Systemen typischerweise /dev/urandom bzw. getrandom(), auf Windows CryptGenRandom. Sie implementiert das Interface Random\Engine\CryptoSafeEngine und eignet sich ausschließlich für sicherheitskritische Anwendungsfälle.
Im Gegensatz zu deterministischen Engines wie Random\Engine\Mt19937 lässt sich Secure nicht mit einem Seed initialisieren – jede Instanz liefert jedes Mal unterschiedliche, statistisch unvorhersehbare Werte. Das macht sie zur ersten Wahl für die Erzeugung von Tokens, kryptografischen Schlüsseln, Session-IDs oder anderen sicherheitssensitiven Zufallsdaten.
Die Engine wird typischerweise als Argument an Random\Randomizer übergeben, der eine komfortable API zur Erzeugung ganzer Zahlen, Byte-Sequenzen, Strings und Permutationen bietet. Alternativ können ihre rohen 16 Bytes (128 Bit) per generate() direkt abgerufen werden.
Hinweis: Da Secure kein Interface für einen Seed bereitstellt, ist reproduzierbares Testen mit dieser Engine nicht möglich. Für Tests sollte eine andere, seedbare Engine verwendet werden.
Beispiele
Sicheres zufälliges Token erzeugen
<?php
use Random\Engine\Secure;
use Random\Randomizer;
$randomizer = new Randomizer(new Secure());
// 32 zufällige Bytes als hexadezimalen String (64 Zeichen)
$token = bin2hex($randomizer->getBytes(32));
echo $token;
// Ausgabe: z. B. 3f9a2c1e7b4d0e8f5c6a1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f
Kryptografisch sichere Zufallszahl in einem Bereich
<?php
use Random\Engine\Secure;
use Random\Randomizer;
$randomizer = new Randomizer(new Secure());
// Zufällige Ganzzahl zwischen 1 und 100 (inklusiv)
$zahl = $randomizer->getInt(1, 100);
echo "Zufallszahl: $zahl\n";
// Zufälligen URL-sicheren String erzeugen (Base64url-kodiert, 43 Zeichen)
$urlToken = $randomizer->getBytesFromString(
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',
32
);
echo "URL-Token: $urlToken\n";
Rohe Bytes direkt über die Engine abrufen
<?php
use Random\Engine\Secure;
$engine = new Secure();
// generate() liefert immer genau 16 zufällige Bytes (128 Bit)
$roheBytes = $engine->generate();
echo 'Länge: ' . strlen($roheBytes) . ' Bytes' . PHP_EOL;
echo 'Hex: ' . bin2hex($roheBytes) . PHP_EOL;
// Wichtig · Fallstricke
Sicherheit: Random\Engine\Secure sollte für alle sicherheitskritischen Zufallswerte (Passwörter, Tokens, kryptografische Schlüssel) bevorzugt werden. Für einfache statistische Simulationen ist sie überdimensioniert und langsamer als deterministische Engines.
Kein Seed möglich: Da diese Engine das CryptoSafeEngine-Interface implementiert, gibt es keine __construct()-Parameter – der interne Zustand wird ausschließlich vom OS-CSPRNG gespeist und ist weder setzbar noch reproduzierbar.
Plattformabhängigkeit: PHP wählt intern die sicherste verfügbare Quelle des jeweiligen Betriebssystems. Auf sehr alten oder exotischen Systemen könnte dies zu Einschränkungen führen, auf modernen Systemen (Linux ≥ 3.17, Windows Vista+, macOS) ist die Quelle jedoch immer hochwertig.
Alternative zu random_bytes(): Wer nur rohe sichere Bytes benötigt, kann auch die prozedurale Funktion random_bytes() verwenden, die intern ebenfalls auf das OS-CSPRNG zurückgreift.