Hakuna matata!
Naja. Das Vorhanden sein von openssl_random_pseudo_bytes() könnte man mit function_exists('openssl_random_pseudo_bytes') prüfen. Ich schlage dennoch nach den Hinweisen von United Power und Felix als Kompromiss vor, mt_rand() zu nutzen.
Bei mt_rand() soll nur die Verteilung und die Geschwindigkeit besser sein als beim gewöhnlichen rand(). Es erfüllt trotzdem nicht die Ansprüche eines kryptografischen Zufalls, diese Eigenschaften enthält man in der Regel nur dann, wenn die Zufallsdaten von einer nicht deterministischen Entropiequelle gespeist werden.
Grund: openssl_random_pseudo_bytes() liefert nämlich überwiegend Bytes welche nicht in dem für diverse Salts gültigem Bereich liegen (insbesondere auch: nicht druckbare).
Das ist nur eine Frage der richtigen Kodierung, da bieten sich diverse Funktionen an, zum Beispiel base64_encode oder bin2hex, jenachdem womit der Hash-Algorithmus umgehen kann.
Von 253 möglichen Bytes (ich nehme mangels Dokumentation an, EOT, EOF und NUL werden aus gutem Grund nicht geliefert) sind (je nach Hash-Verfahren) nur 36, 62 oder 64 in Salts gültig. Die anderen müsste man aussortieren.
Nein nicht aussortieren, sondern so umkodieren, dass sie Element der Zielmenge werden.
Klar: auch das ist machbar. Nur holt man dann im Durchschnitt (bei 64 gültigen Zeichen) ungefähr 88 Bytes ab um einen 22-Zeichen starken, gültigen Salt zu haben. Das klingt "teuer".
Beim Kodierung geht nämlich auch keine Entropie verloren. Und dieses Problem stellt sich nicht.
“All right, then, I'll go to hell.” – Huck Finn