Ci sono molte risposte a questa domanda, ma nessuna di esse sfrutta un generatore di numeri pseudo-casuali crittograficamente sicuro (CSPRNG).
La risposta semplice, sicura e corretta è usare RandomLib e non reinventare la ruota.
Per quelli di voi che insistono nell'inventare la propria soluzione, PHP 7.0.0 fornirà random_int()
a tale scopo; se sei ancora su PHP 5.x, abbiamo scritto un polyfill per PHP 5 inrandom_int()
modo da poter utilizzare la nuova API anche prima di eseguire l'aggiornamento a PHP 7.
Generare in modo sicuro numeri interi casuali in PHP non è un compito banale. È sempre necessario verificare con gli esperti di crittografia StackExchange residenti prima di distribuire un algoritmo di produzione domestica.
Con un generatore di numeri interi sicuro installato, generare una stringa casuale con un CSPRNG è una passeggiata nel parco.
Creazione di una stringa sicura e casuale
/**
* Generate a random string, using a cryptographically secure
* pseudorandom number generator (random_int)
*
* This function uses type hints now (PHP 7+ only), but it was originally
* written for PHP 5 as well.
*
* For PHP 7, random_int is a PHP core function
* For PHP 5.x, depends on https://github.com/paragonie/random_compat
*
* @param int $length How many characters do we want?
* @param string $keyspace A string of all possible characters
* to select from
* @return string
*/
function random_str(
int $length = 64,
string $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
): string {
if ($length < 1) {
throw new \RangeException("Length must be a positive integer");
}
$pieces = [];
$max = mb_strlen($keyspace, '8bit') - 1;
for ($i = 0; $i < $length; ++$i) {
$pieces []= $keyspace[random_int(0, $max)];
}
return implode('', $pieces);
}
Utilizzo :
$a = random_str(32);
$b = random_str(8, 'abcdefghijklmnopqrstuvwxyz');
$c = random_str();
Demo : https://3v4l.org/IMJGF (Ignora gli errori PHP 5; ha bisogno di random_compat)