Start · Sprachen · PHP · Referenz · Random\CryptoSafeEngine

Random\CryptoSafeEngine

Interface

Marker-Interface, das kennzeichnet, dass eine <code>Random\Engine</code>-Implementierung kryptografisch sichere Zufallswerte erzeugt.

seit PHP 8.2.0 Kategorie: crypto

Signatur

interface Random\CryptoSafeEngine extends Random\Engine

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!
a3f2c1d4e5b6a7f8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2

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
42 bool(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.