Há muitas respostas para essa pergunta, mas nenhuma delas utiliza um gerador de números pseudo-aleatórios criptograficamente seguros (CSPRNG).
A resposta simples, segura e correta é usar o RandomLib e não reinventar a roda.
Para aqueles que insistem em inventar sua própria solução, o PHP 7.0.0 fornecerá random_int()
esse propósito; se você ainda usa o PHP 5.x, criamos um polyfill do PHP 5 pararandom_int()
que você possa usar a nova API antes de atualizar para o PHP 7.
Gerar números inteiros aleatórios com segurança no PHP não é uma tarefa trivial. Você deve sempre verificar com os especialistas em criptografia StackExchange residentes antes de implantar um algoritmo caseiro na produção.
Com um gerador inteiro seguro no lugar, gerar uma sequência aleatória com um CSPRNG é uma caminhada no parque.
Criando uma seqüência aleatória segura
/**
* 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();
Demo : https://3v4l.org/IMJGF (Ignore as falhas do PHP 5; ele precisa de random_compat)