Start · Sprachen · PHP · Referenz · openssl_random_pseudo_bytes

openssl_random_pseudo_bytes

Funktion

Erzeugt eine kryptografisch sichere pseudozufällige Byte-Folge der angegebenen Länge.

seit PHP 5.3.0 Kategorie: crypto

Signatur

openssl_random_pseudo_bytes(int $length, bool &$strong_result = null): string

Beschreibung

openssl_random_pseudo_bytes() nutzt den OpenSSL-Zufallszahlengenerator, um eine Byte-Folge der gewünschten Länge zu erzeugen. Die Funktion ist besonders für sicherheitsrelevante Anwendungsfälle geeignet, etwa für die Erzeugung von Tokens, Salts, Initialisierungsvektoren (IVs) oder Sitzungsschlüsseln.

Über den optionalen zweiten Parameter $strong_result (wird als Referenz übergeben) kann geprüft werden, ob der intern verwendete Algorithmus als kryptografisch stark eingestuft wird. Gibt OpenSSL hier false zurück, sollte das Ergebnis nicht für sicherheitskritische Zwecke verwendet werden.

Ab PHP 7.0 steht die Funktion random_bytes() als moderne Alternative zur Verfügung, die immer einen kryptografisch sicheren Zufallswert liefert und einfacher zu verwenden ist. Für neue Projekte wird random_bytes() empfohlen.

Die zurückgegebene Byte-Folge ist binär und enthält beliebige Bytes (inklusive Null-Bytes). Für eine hexadezimale Darstellung eignet sich bin2hex(), für Base64-kodierte Ausgabe base64_encode().

Parameter

Name Typ Default Beschreibung
$length Pflicht int Gewünschte Länge der erzeugten Byte-Folge in Bytes. Muss eine positive ganze Zahl sein.
$strong_result bool null Wird als Referenz übergeben und nach dem Aufruf auf true gesetzt, wenn ein kryptografisch starker Algorithmus verwendet wurde, andernfalls auf false. In sicherheitskritischen Anwendungen sollte dieser Wert geprüft werden.

Rückgabewert

Typ
string
Beschreibung
Gibt eine binäre Zeichenkette der angeforderten Länge zurück, die pseudozufällige Bytes enthält. Im Fehlerfall (z. B. ungültige Länge oder OpenSSL-Fehler) wird false zurückgegeben.

Beispiele

Zufälliges Token für Passwort-Reset erzeugen

<?php
// 32 zufällige Bytes erzeugen und als Hex-String ausgeben (64 Zeichen)
$bytes = openssl_random_pseudo_bytes(32, $strong);

if (!$strong) {
    throw new RuntimeException('Kein kryptografisch starker Zufallsgenerator verfügbar!');
}

$token = bin2hex($bytes);
echo $token; // z. B. a3f2e1...  (64 Hex-Zeichen)
a3f2e1d0c9b8a7f6e5d4c3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f2

Initialisierungsvektor (IV) für AES-Verschlüsselung erzeugen

<?php
$cipher = 'AES-256-CBC';
$ivLength = openssl_cipher_iv_length($cipher);

$iv = openssl_random_pseudo_bytes($ivLength, $strong);

if (!$strong) {
    throw new RuntimeException('Schwacher Zufallsgenerator – IV nicht sicher!');
}

$key = openssl_random_pseudo_bytes(32); // 256-Bit-Schlüssel
$plaintext = 'Geheime Nachricht';

$encrypted = openssl_encrypt($plaintext, $cipher, $key, OPENSSL_RAW_DATA, $iv);

echo base64_encode($encrypted);

Vergleich mit der modernen Alternative random_bytes()

<?php
// Modern (PHP >= 7.0): random_bytes() ist einfacher und immer sicher
$modern = bin2hex(random_bytes(16));
echo 'random_bytes: ' . $modern . PHP_EOL;

// Klassisch mit openssl_random_pseudo_bytes
$classic = bin2hex(openssl_random_pseudo_bytes(16, $strong));
echo 'openssl:       ' . $classic . PHP_EOL;
echo 'Stark:         ' . ($strong ? 'Ja' : 'Nein') . PHP_EOL;
random_bytes: 4a3f2e1d0c9b8a7f6e5d4c3b2a1f0e9d openssl: 9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a Stark: Ja

// Wichtig · Fallstricke

Sicherheitshinweis: Prüfe immer den zweiten Parameter $strong_result. Ist er false, ist der erzeugte Wert möglicherweise nicht kryptografisch sicher und darf nicht für Passwort-Hashes, Tokens oder Schlüssel verwendet werden.

Deprecation / Migration: Ab PHP 7.0 sollte stattdessen random_bytes() verwendet werden, da diese Funktion immer eine kryptografisch sichere Quelle nutzt und keine manuelle Prüfung auf Stärke erfordert. openssl_random_pseudo_bytes() ist weiterhin verfügbar, aber in modernem Code nicht mehr die erste Wahl.

Binäre Ausgabe: Der Rückgabewert ist eine rohe Binärzeichenkette. Für Datenbankfelder oder URLs empfiehlt sich eine Kodierung via bin2hex() oder base64_encode(), um Probleme mit Sonderzeichen oder Null-Bytes zu vermeiden.