Signatur
Beschreibung
Random\CryptoSafeEngine ist ein sogenanntes Marker-Interface – es definiert keine eigenen Methoden, sondern dient ausschließlich als Typenmarkierung. Eine Klasse, die dieses Interface implementiert, signalisiert damit, dass ihre Zufallszahlenerzeugung den Anforderungen an kryptografische Sicherheit genügt. Das bedeutet, die erzeugten Bytes sind statistisch nicht vorhersehbar und für sicherheitskritische Anwendungen geeignet.
In der PHP-Standardbibliothek implementiert Random\Engine\Secure dieses Interface. Diese Engine greift auf die kryptografisch sicheren Zufallsquellen des Betriebssystems zurück (z. B. getrandom() unter Linux oder CryptGenRandom unter Windows) und ist damit für Passwortgenerierung, Token-Erzeugung oder kryptografische Schlüssel geeignet.
Das Interface ermöglicht es, im eigenen Code per Typprüfung (instanceof) oder Typdeklaration sicherzustellen, dass nur kryptografisch sichere Engines verwendet werden. So kann man z. B. in einer Funktion, die ein sicheres Token generiert, explizit eine Random\CryptoSafeEngine als Parameter fordern und unsichere Engines wie Random\Engine\Mt19937 oder Random\Engine\PcgOneseq128XslRr64 zur Kompilierzeit ausschließen.
Eigene Engine-Implementierungen sollten dieses Interface nur dann implementieren, wenn die zugrundeliegende Zufallsquelle tatsächlich kryptografisch sicher ist. Eine falsche Implementierung des Interfaces kann zu schwerwiegenden Sicherheitslücken führen.
Beispiele
Typprüfung auf kryptografische Sicherheit
<?php
use Random\CryptoSafeEngine;
use Random\Engine\Secure;
use Random\Engine\Mt19937;
use Random\Randomizer;
function generateSecureToken(CryptoSafeEngine $engine, int $length = 32): string {
$randomizer = new Randomizer($engine);
return bin2hex($randomizer->getBytes($length));
}
// Funktioniert: Secure implementiert CryptoSafeEngine
$token = generateSecureToken(new Secure());
echo $token . PHP_EOL;
// Fehler: Mt19937 implementiert CryptoSafeEngine NICHT
// generateSecureToken(new Mt19937()); // TypeError!
Eigene kryptografisch sichere Engine implementieren
<?php
use Random\CryptoSafeEngine;
/**
* Beispiel einer eigenen Engine, die auf random_bytes() aufbaut.
* Da random_bytes() intern ebenfalls die OS-Zufallsquelle nutzt,
* ist die Implementierung von CryptoSafeEngine hier korrekt.
*/
class MySecureEngine implements CryptoSafeEngine {
public function generate(): string {
// random_bytes liefert kryptografisch sichere Zufallsbytes
return random_bytes(PHP_INT_SIZE);
}
}
$engine = new MySecureEngine();
$randomizer = new Random\Randomizer($engine);
echo $randomizer->getInt(1, 100) . PHP_EOL;
var_dump($engine instanceof CryptoSafeEngine); // true
// Wichtig · Fallstricke
Sicherheitshinweis: Implementieren Sie Random\CryptoSafeEngine nur dann in einer eigenen Engine-Klasse, wenn Sie absolut sicher sind, dass die verwendete Zufallsquelle kryptografisch stark ist. Das Interface selbst erzwingt keine technische Sicherheitsgarantie – es handelt sich um eine reine Konvention. Eine falsche Markierung kann dazu führen, dass sicherheitskritischer Code (z. B. Tokengenerierung, Passwort-Hashing-Salts) mit vorhersehbaren Werten arbeitet.
Für die meisten Anwendungsfälle sollte direkt Random\Engine\Secure verwendet werden, da diese Engine von PHP offiziell als kryptografisch sicher eingestuft wird und plattformspezifisch die bestmögliche Zufallsquelle nutzt.