Signatur
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
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)
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;
// 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.