Programação, PHP, Javascript, HTML, CSS, Python
sexta, 3 de setembro

Sequências aleatórias com nível de complexidade

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;
}
Tags:

Leave a Comment

Sobre o autor

Alejandro Moraga é um cientista da computação. Atualmente é o Webmaster da FAPESP. Já foi o desenvolvedor de sistemas ERP e CRM na Internetmídia. Moraga também desenvolve frameworks, ferramentas, sistemas e sites em nome da empresa METS no qual é sócio junto com sua esposa, e é um pesquisador da Inteligência Artificial.

Mais artigos

Converter array para objetos específicos em PHP
Converter array para objetos específicos em PHP

A conversão de tipos por Cast do PHP é limitada quando falamos de objetos. Para gerar objetos específicos vamos [Leia mais]

Valor monetário (float) a todo custo
Valor monetário (float) a todo custo

Valor monetário a todo custo é porque a função abaixo vai extrair de uma string e retornar os números com ponto [Leia mais]

Validar números de agências e contas correntes do Banco do Brasil
Validar números de agências e contas correntes do Banco do Brasil

Outro dia precisei validar números de agências e contas do Banco do Brasil. Para quem precisar segue as [Leia mais]

Guia de Expressões Regulares Compatíveis com Perl – PCRE
Guia de Expressões Regulares Compatíveis com Perl – PCRE

Guia PHP PCRE com funções, meta caracteres, modificadores do padrão, classes de caracteres base, quantificadores e [Leia mais]