Sequências de caracteres aleatórios são úteis para muitos propósitos. Existem funções pré-prontas, como a rand do PHP que geram números aleatórios, mas por que não aprimorar este recurso e gerar sequências aleatórias mais complexas, misturando números, letras minúsculas, letras maiúsculas e caracteres especiais como “$”, “%”, “|”? Dependendo da aplicação e do nível de segurança você pode querer gerar apenas números ou então algo mais complexo. Pensando nisso e também em resolver os meus problemas construí uma função para gerar sequências aleatórias onde podemos definir a quantidade de caracteres e o mais importante, o nível de complexidade da sequência.
Por que apenas números não são o suficiente? É grande a chance de um usuário adivinhar a senha de outro usuário em um sistema onde as senhas geradas são numéricas de 5 dígitos.
Exemplos:
# números e letras minúsculas e maiúsculas, 10 caracteres randstr(); //KfRNWnST2X # números e letras minúsculas e maiúsculas, 20 caracteres randstr(20); // uP8HmZVzHlAGwetDMuPu # números, 5 caracteres randstr(5, 1); // 41626 # números e letras minúsculas, 12 caracteres randstr(12, 2); // 0dlae5sk70q9 # números, letras minúsculas e maiúsculas e caracteres especias, 10 caracteres randstr(10, 4); // D>2)GY1WW@
Código fonte comentado
A função foi implementada em PHP, mas você pode facilmente adaptá-la para outra linguagem.
function randstr($len=10, $level=3) {
# une os elementos do array formando uma string
$c = implode(
# extrai uma parte do array
array_slice(
array(
'1234567890', # level 1
'abcdefghijklmnopqrstuvwxyz', # level 2
'ABCDEFGHIJKLMNOPQRSTUVWXYZ', # level 3
'!@$%*()[]{}<>,-_=+|' # level 3
), 0, $level));
# total de caracteres - 1,
# máximo valor para a escolha aleatória de caracteres
$l = strlen($c) - 1;
# armazena os caracteres escolhidos
$s = '';
# sorteia caracteres até que o valor de $len seja 0
for (; $len; $len--, $s .= $c{rand(0, $l)});
# retorna os caracteres aleatórios
return $s;
}
Nos caracteres especiais não inclui “?”, “&” e “#” para evitar o risco dos navegador e interpretadores acabarem confundindo esses caracteres com funcionalidades. Na prática, “?” separa o endereço das variáveis, “&” separa as variáveis e “#” indica ponteiros. Se você não for usar os caracteres aleatórios na transição de informações entre o cliente e navegador e quiser utilizá-los, inclua-os no quarto item do array.
Crie ou exclua níveis alterando os elementos do array de caracteres. Um novo elemento é um nível a mais.
Código fonte
/**
* Gera strings aleatórias
*
* @author Alejandro Fernandez Moraga <moraga86@gmail.com>
* @param int $len Quantidade de caracteres aleatórios
* @param int $level Nível de dificuldade da string
* @return string
*/
function randstr($len=10, $level=3) {
$c = implode(
array_slice(
array(
'1234567890',
'abcdefghijklmnopqrstuvwxyz',
'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'!@$%*()[]{}<>,-_=+|'
), 0, $level));
$l = strlen($c) - 1;
$s = '';
for (; $len; $len--, $s .= $c{rand(0, $l)});
return $s;
}