Hay muchas respuestas a esta pregunta, pero ninguna de ellas aprovecha un generador de números pseudoaleatorios criptográficamente seguros (CSPRNG).
La respuesta simple, segura y correcta es usar RandomLib y no reinventar la rueda.
Para aquellos de ustedes que insisten en inventar su propia solución, PHP 7.0.0 proporcionará random_int()
para este propósito; si todavía está en PHP 5.x, escribimos un polyfill de PHP 5 pararandom_int()
que pueda usar la nueva API incluso antes de actualizar a PHP 7.
La generación segura de enteros aleatorios en PHP no es una tarea trivial. Siempre debe consultar con sus expertos en criptografía StackExchange residentes antes de implementar un algoritmo interno en producción.
Con un generador entero seguro en su lugar, generar una cadena aleatoria con un CSPRNG es un paseo por el parque.
Crear una cadena segura y aleatoria
/**
* 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);
}
Uso :
$a = random_str(32);
$b = random_str(8, 'abcdefghijklmnopqrstuvwxyz');
$c = random_str();
Demostración : https://3v4l.org/IMJGF (ignore las fallas de PHP 5; necesita random_compat)