Por vezes no desenvolvimento de um software nos deparamos com a necessidade de gerar strings de maneira aleatória, para senhas, tokens ou outros objetivos. Neste artigo vamos entender como gerar strings randômicas em PHP, abordando diversas maneiras e entendendo os níveis de segurança e complexidade de cada abordagem.

O Que É uma String Randômica?

Uma string randômica é uma sequência de caracteres gerada de forma aleatória. Parece simples, certo? Mas as implicações são vastas. Essas strings são frequentemente usadas em situações como tokens de autenticação, senhas temporárias e até como identificadores únicos.

Exemplo Básico de Uso em PHP:

$randomString = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10);

Explicação:
Neste exemplo, utilizamos str_shuffle para embaralhar uma string que contém todos os dígitos e letras maiúsculas e minúsculas. Em seguida, usamos substr para pegar os 10 primeiros caracteres da string embaralhada. O resultado é uma string randômica de 10 caracteres.

Por Que Strings Randômicas São Úteis?

Imagine que você está desenvolvendo um sistema de autenticação. Você poderia gerar tokens únicos para cada sessão de usuário, tokens esses que seriam complexos de se adivinhar graças à sua natureza randômica. Ou talvez você esteja desenvolvendo um jogo online e precisa de uma forma de gerar IDs únicos para cada item em um inventário. A lista de usos é bastante ampla!

Strings Randômicas e a Importância da Segurança

Não podemos falar sobre strings randômicas em PHP sem tocar no tópico da segurança. Se você está usando estas strings como parte de um sistema de autenticação, é crucial que elas sejam geradas de forma segura. Isso significa que a função que você utiliza para gerar a string deve ser criptograficamente segura.

Outra consideração a ser levada em conta é o fato de que em diversos contextos de uso, é necessário que a string gerada possua nenhuma ou raríssima chance de duplicidade com strings previamente ou posteriormente geradas.

Exemplo de Função Criptograficamente Segura em PHP:

$secureRandomString = bin2hex(random_bytes(16));

Explicação:
Neste exemplo, usamos a função random_bytes para gerar uma string de bytes aleatórios. Em seguida, usamos bin2hex para converter esses bytes em uma representação hexadecimal. Isso nos dá uma string randômica que é criptograficamente segura, ideal para situações que envolvem dados sensíveis.

Método Simples de Geração de Strings Randômicas em PHP: Função rand() e substr()

O PHP oferece várias funções para lidar com strings e números aleatórios, e no que diz respeito à simplicidade, o uso combinado das funções rand() e substr() é uma maneira fácil de gerar strings randômicas. Primeiro vamos conhecer cada uma destas funções.

O que faz a função rand() em PHP?

A função rand() em PHP gera um número inteiro aleatório. Você pode especificar um intervalo como argumentos, caso contrário, ele produzirá um número entre 0 e getrandmax() (um valor definido pelo sistema).

Exemplo Simples:

$randomNumber = rand(1, 10);

Explicação:
Neste exemplo, a função rand() gerará um número aleatório entre 1 e 10, incluindo ambos os números.

O que faz a função substr() em PHP?

A função substr() é usada para extrair uma parte de uma string. Ela aceita três argumentos: a string original, a posição inicial e o comprimento da substring que você deseja extrair.

Exemplo Simples:

$substring = substr("Hello World", 0, 5);

Explicação:
Neste exemplo, a função substr() pega os cinco primeiros caracteres da string “Hello World”, resultando na substring “Hello”.

Combinando rand() e substr() para Gerar Strings Randômicas em PHP

Agora, vamos ver como podemos combinar essas duas funções para gerar uma string randômica. O método é rudimentar, mas eficaz para cenários não críticos.

Exemplo de Código:

function gerarStringRandomica(int $tamanho) {
  $characters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  $randomString = '';
  
  for ($i = 0; $i < $tamanho; $i++) {
      $index = rand(0, strlen($characters) - 1);
      $randomString .= $characters[$index];
  }
  
  return $randomString;
}

Explicação Detalhada:

  1. Definir o Conjunto de Caracteres: A variável $characters contém todos os caracteres que podem ser usados na string randômica.
  2. Inicializar a String Randômica: A variável $randomString é inicializada como uma string vazia. Ela armazenará o resultado final.
  3. Loop for: O loop corre 10 vezes, o que significa que a string randômica terá (o $tamanho) de caracteres.
  4. Gerar Índice Aleatório: A função rand() gera um índice aleatório entre 0 e o tamanho do conjunto de caracteres menos 1 (strlen($characters) - 1).
  5. Adicionar Caractere à String: O caractere correspondente ao índice aleatório é então adicionado à string randômica.

Pontos a Considerar

  1. Não é Criptograficamente Seguro: Este método não deve ser usado para gerar strings que serão usadas em situações que exigem alta segurança, como tokens de autenticação.
  2. Performance: O método é relativamente rápido, mas para grandes volumes de strings ou strings muito longas, métodos mais eficientes podem ser mais apropriados.

E aí está! Com pouco mais do que algumas linhas de código e funções nativas do PHP, você tem uma forma de gerar strings randômicas. Prém, este não é uma abordagem performática e das mais seguras. Vamos explorar métodos mais avançados e seguros a seguir.

Método Intermediário: Função array_rand()

Na seção anterior, exploramos uma maneira bastante direta de gerar strings randômicas em PHP usando as funções rand () e substr(). Agora, vamos elevar o nível um pouco e discutir outra abordagem usando a função array_rand().

O Que É a Função array_rand()?

Essa função aceita um array e um número n como argumentos e retorna um ou mais índices aleatórios do array. Quando um único número é fornecido como segundo argumento, um único índice é retornado. Se o segundo argumento for maior que um, um array de índices aleatórios é retornado.

Exemplo Simples:

$myArray = array(1, 2, 3, 4, 5);
$randomKey = array_rand($myArray);

Explicação:
Neste exemplo, array_rand() escolhe um índice aleatório do array $myArray e armazena-o na variável $randomKey.

Usando array_rand() para Gerar Strings Randômicas

Agora, como podemos usar array_rand() para gerar uma string randômica em PHP?

Exemplo de Código:

function gerarStringRandomica(int $tamanho) {
   $characters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
   $charactersArray = str_split($characters);
   $randomString = '';
   
   for ($i = 0; $i < 10; $i++) {
       $randomKey = array_rand($charactersArray);
       $randomString .= $charactersArray[$randomKey];
   }
   
   return $randomString;
}

Explicação Detalhada:

  1. Converter a String em Array: Usamos str_split() para transformar a string $characters em um array, facilitando o trabalho com array_rand().
  2. Inicializar a String Randômica: A variável $randomString começa como uma string vazia e armazenará nossa string randômica.
  3. Loop For: O loop vai correr 10 vezes, resultando em uma string randômica de $tamanho caracteres.
  4. Obter Índice Aleatório: Usamos array_rand() para obter um índice aleatório do array $charactersArray.
  5. Adicionar Caractere à String: O caractere no índice aleatório escolhido é então adicionado à string randômica.

Pontos a Considerar

  1. Performance: array_rand() é uma função eficaz, mas para strings muito longas ou grandes volumes de strings, métodos mais otimizados podem ser melhores.
  2. Não é Criptograficamente Seguro: Este método, como o anterior, não é adequado para situações que requerem alta segurança, como autenticação ou criptografia.

Quando Usar array_rand()?

Esta abordagem é útil quando você já está trabalhando com arrays e não quer se preocupar em converter strings em arrays e vice-versa. É uma opção intermediária entre o método super simples e os métodos mais robustos que discutiremos a seguir.

Método Avançado para gerar Strings Randômicas em PHP: random_bytes() e bin2hex()

Depois de conhecermos dois métodos: um simples e um intermediário, para gerar strings randômicas em PHP, vamos trabalhar um método mais avançado, e de certa maneira, mais indicado, que combina random_bytes() e bin2hex().

Este método é criptograficamente seguro e mais apropriado para situações que exigem um alto nível de segurança, como geração de tokens de autenticação e senhas temporárias.

O Que É a Função random_bytes() em PHP?

A função random_bytes() gera uma string de bytes pseudo-aleatórios e é considerada criptograficamente segura. Ela aceita um único argumento que define o número de bytes aleatórios a serem gerados.

Exemplo Simples:

$bytes = random_bytes(5);

Explicação:
Neste exemplo, random_bytes() gera uma string de 5 bytes aleatórios, que é armazenada na variável $bytes.

O Que É a Função bin2hex() em PHP?

A função bin2hex() converte dados binários em sua representação hexadecimal. Esta função é frequentemente usada para exibir dados binários de forma legível.

Exemplo Simples:

$hex = bin2hex("foo");  // Resultado: '666f6f'

Explicação:
Aqui, a função bin2hex() está convertendo a string “foo” em sua representação hexadecimal, que fica armazenada na variável $hex.

Combinando random_bytes() e bin2hex() para Gerar Strings Randômicas Seguras

Vamos ver como essas duas funções podem ser combinadas para criar uma string randômica segura.

Exemplo de Código:

function gerarStringRandomica($tamanho){
   $bytes = random_bytes($tamanho);
   $randomString = bin2hex($bytes);
   return $randomString;
}

Explicação Detalhada:

  1. Gerar Bytes Aleatórios: A função random_bytes() é chamada com $tamanho como argumento para gerar uma string de bytes aleatórios. 2Converter para Hexadecimal: Finalmente, usamos bin2hex() para converter os bytes aleatórios em uma string hexadecimal. Isso também tem o efeito de dobrar o comprimento da string final.

Pontos a Considerar

  1. Segurança: Este método é criptograficamente seguro e adequado para situações que exigem um alto grau de segurança.
  2. Comprimento da String: Note que o comprimento da string resultante será o dobro do número de bytes gerados, devido à conversão para hexadecimal.

Uma variação da função seria usar o tamanho de entrada como também o tamanho da string de retorno:

function gerarStringRandomica($tamanho){
   $bytes = random_bytes($tamanho);
   $randomString = bin2hex($bytes);
   return substr($randomString, 0, $tamanho);
}

Usando OpenSSL para Criptografia Forte na geração de Strings Randômicas em PHP

A extensão OpenSSL para PHP permite uma série de capacidades criptográficas, e é especialmente útil quando se busca uma geração de strings aleatórias seguras para uso em contextos que exigem uma alta qualidade criptográfica. Vamos explorar como você pode gerar uma string aleatória segura usando OpenSSL.

Pré-requisitos

Para começar, você precisa garantir que a extensão OpenSSL esteja habilitada no seu ambiente PHP.

Método openssl_random_pseudo_bytes()

A função openssl_random_pseudo_bytes() é um dos métodos mais recomendados para gerar uma string aleatória segura. A função retorna uma string de bytes pseudo-aleatórios, e ela também aceita um segundo argumento para verificar se os bytes gerados são criptograficamente fortes.

Exemplo de uso básico:

<?php
$length = 16; // 128 bits
$secure = true;
$randomString = openssl_random_pseudo_bytes($length, $secure);

// Verificar se é uma string criptograficamente forte
if($secure === true) {
    echo bin2hex($randomString);
} else {
    die('Não foi possível gerar uma string segura.');
}
?>

Conversão para Formatos Utilizáveis

Os bytes aleatórios gerados podem não ser diretamente utilizáveis como strings, dependendo do seu caso de uso. Para converter a string de bytes para um formato que você pode usar (como hexadecimal ou base64), você pode usar bin2hex () ou base64_encode().

<?php
// Converter para hexadecimal
$hexString = bin2hex($randomString);
echo "Hexadecimal: " . $hexString;

// Converter para Base64
$base64String = base64_encode($randomString);
echo "Base64: " . $base64String;
?>

Combinando com Outras Técnicas

Você também pode combinar a geração OpenSSL com outras técnicas, como hashing, para aumentar a aleatoriedade ou para atender aos requisitos específicos do seu projeto.

<?php
// Usando Hash SHA256
$hashedRandomString = hash('sha256', $randomString);
echo "SHA-256: " . $hashedRandomString;
?>

Considerações de Segurança

É importante usar o segundo argumento da função openssl_random_pseudo_bytes() para verificar se os bytes gerados são criptograficamente seguros. Se não forem, é melhor não usar a string para fins de segurança.

A extensão OpenSSL em PHP fornece uma forma robusta e segura de gerar strings aleatórias, e é altamente recomendada para cenários que requerem alta segurança. As diversas opções de formatação e hashing fornecem uma flexibilidade adicional para atender a uma variedade de necessidades.

Com este conhecimento, você poderá gerar strings aleatórias de forma segura e eficaz em seus projetos PHP.

Considerações Finais

A escolha do método para gerar strings aleatórias em PHP depende fortemente do seu caso de uso. Se você precisa de segurança, openssl_random_pseudo_bytes() é o caminho a seguir, embora seja um pouco mais lento em comparação com outros métodos. A avaliação do desempenho e a segurança devem andar de mãos dadas para fazer a escolha certa para o seu aplicativo.