Descubra como gerar números aleatórios seguros com secrets

Publicado em: 27/02/2026
Tempo de leitura: 9 minutos

Você já parou para pensar como o seu computador decide qual será o próximo número em um sorteio? No mundo da programação, criar aleatoriedade não é tão simples quanto parece. Se você está desenvolvendo um sistema de segurança, como um gerador de senhas no Python, usar a ferramenta errada pode deixar a porta aberta para hackers. É aqui que entra o módulo secrets, a solução definitiva para quem precisa de segurança criptográfica real. Neste artigo, você vai descobrir como gerar números aleatórios seguros com secrets e entender por que ele é superior aos métodos tradicionais.

O que é a aleatoriedade e por que ela importa?

Na computação, existem dois tipos principais de números aleatórios: os pseudoaleatórios e os criptograficamente seguros. A maioria das funções que usamos no dia a dia, como as encontradas ao usar módulo random python, pertence ao primeiro grupo. Elas são excelentes para simulações e jogos, mas possuem um ponto fraco: são baseadas em algoritmos determinísticos. Isso significa que, se alguém descobrir o valor inicial (chamado de semente ou seed), poderá prever todos os números seguintes.

Para proteger dados sensíveis, precisamos do segundo tipo. Gerar números aleatórios seguros garante que ninguém consiga prever o resultado, mesmo que conheça o código-fonte do programa. Segundo a Wikipédia, a criptografia moderna depende inteiramente de fontes de entropia que não podem ser reproduzidas por invasores.

A diferença entre o módulo Random e o Secrets

É comum que iniciantes tentem criar segurança usando o módulo random. No entanto, a própria documentação oficial do Python adverte que ele não deve ser usado para fins de segurança ou criptografia. O módulo random foi projetado para modelagem estatística e rapidez, não para proteção contra ataques.

O módulo secrets foi introduzido no Python 3.6 justamente para preencher essa lacuna. Ele utiliza fontes de aleatoriedade fornecidas pelo sistema operacional, que são muito mais imprevisíveis. Ao descobrir como gerar números aleatórios seguros com secrets, você eleva o nível de proteção do seu software para padrões industriais. Enquanto o random pode ser comparado a um dado comum de jogo, o secrets é como um cofre digital de alta tecnologia.

Como o módulo Secrets funciona na prática?

Diferente de outros módulos e pacotes no Python, o secrets foca na simplicidade para evitar erros do desenvolvedor. Ele oferece funções específicas para gerar números, tokens e até mesmo escolher elementos de uma lista de forma segura. Ele acessa o /dev/urandom em sistemas Unix ou o CryptGenRandom no Windows, garantindo que a semente venha de ruídos físicos do hardware ou eventos imprevisíveis do sistema.

Ao trabalhar com hash de senhas em Python, o uso do secrets é obrigatório para gerar o “salt” (um dado aleatório adicionado à senha antes do hash). Sem isso, seu sistema fica vulnerável a ataques de tabela arco-íris (rainbow tables), onde atacantes testam milhões de combinações pré-computadas.

Gerando números inteiros seguros

A função mais básica para gerar números é a secrets.randbelow(n). Ela retorna um número inteiro aleatório no intervalo de 0 até o valor definido em n (excluindo o n). Outra opção útil é a secrets.randbits(k), que gera um número com um número específico de bits aleatórios.

Exemplo de código: Gerando números inteiros

Python
import secrets

# Gera um número aleatório entre 0 e 99
numero_seguro = secrets.randbelow(100)
print(f"Seu número seguro é: {numero_seguro}")

# Gera um número aleatório com 16 bits de profundidade
bits_seguros = secrets.randbits(16)
print(f"Número de 16 bits: {bits_seguros}")

Note que, ao contrário do que acontece na lógica de programação com Python tradicional para jogos, aqui não definimos uma semente fixa. O objetivo é justamente ser o mais imprevisível possível para o sistema.

Criando tokens para autenticação e URLs

Muitas vezes, não precisamos apenas de números, mas de sequências de texto seguras. O módulo secrets facilita a criação de tokens hexadecimais ou strings codificadas em Base64. Isso é essencial para criar links de recuperação de senha ou chaves de APIs com FastAPI.

Exemplo de código: Gerando tokens de segurança

Python
import secrets

# Gera um token hexadecimal seguro (32 caracteres)
token_hex = secrets.token_hex(16)
print(f"Token Hex: {token_hex}")

# Gera um token seguro para URLs (Base64)
token_url = secrets.token_urlsafe(16)
print(f"Token para URL: {token_url}")

O uso de token_urlsafe é altamente recomendado. Ele gera caracteres que não precisam ser codificados manualmente, evitando erros comuns que resultam em problemas como o UnicodeDecodeError.

Escolhendo elementos de forma aleatória e segura

Se você tem uma lista de opções e precisa escolher uma sem que haja padrões viciados, a função secrets.choice() é a ferramenta ideal. Ela funciona de forma idêntica à versão do módulo random, mas com o motor de segurança por trás.

Imagine que você está criando um jogo de adivinhação de número, mas focado em segurança cibernética. Usar o secrets garante que nem o desenvolvedor consiga manipular o resultado através da manipulação do estado interno do gerador.

Boas práticas ao manipular dados sensíveis

Gerar o número ou token é apenas metade do trabalho. Para manter a segurança, você deve seguir algumas diretrizes importantes:

  • Nunca exiba segredos em logs: Evite usar o sistema de logging para registrar tokens gerados pelo secrets.
  • Use comparação segura: Para verificar se um token fornecido pelo usuário é igual ao armazenado no banco, use secrets.compare_digest(a, b). Isso impede ataques de tempo (timing attacks).
  • Tamanho importa: Para tokens de segurança, use pelo menos 32 bytes de entropia para garantir proteção contra força bruta.

Consultar as recomendações do OWASP é sempre uma excelente ideia para quem deseja aprofundar-se em segurança de aplicações web e entender os vetores de ataque modernos.

Comparação de desempenho: Secrets vs Random

Uma dúvida comum é se o secrets é muito mais lento que o random. Em aplicações pequenas, a diferença é imperceptível. No entanto, em sistemas que geram milhões de números por segundo, o secrets terá um custo computacional maior devido às chamadas de sistema complexas.

CaracterísticaMódulo RandomMódulo Secrets
Segurança CriptográficaNãoSim
VelocidadeAltaMédia
Uso recomendadoSimulações e JogosSenhas e Tokens
DeterminísticoSim (com seed)Não

Construindo um Gerador de Senhas Robusto

Agora que você aprendeu a descobrir como gerar números aleatórios seguros com secrets, vamos aplicar esse conhecimento em um projeto real. Vamos criar uma ferramenta que gera senhas complexas, contendo letras maiúsculas, minúsculas, números e símbolos.

Passo 1: Definindo o conjunto de caracteres

Utilizaremos o módulo string para obter listas prontas de caracteres ASCII. Isso evita que tenhamos que digitar manualmente cada letra e número, reduzindo erros humanos.

Python
import string
import secrets

alfabeto = string.ascii_letters + string.digits + string.punctuation

Passo 2: Construindo a lógica de repetição

Usaremos um loop para selecionar caracteres aleatórios do nosso alfabeto e montaremos a senha final. O tamanho da senha deve ser configurável para atender a diferentes requisitos de segurança.

tamanho_senha = 12
senha = ''.join(secrets.choice(alfabeto) for i in range(tamanho_senha))

Código Completo do Projeto

Abaixo está o script completo para o seu gerador de senhas seguro. Este código combina os conceitos de listas, loops e o módulo secrets para criar uma ferramenta de nível profissional.

Python
import string
import secrets

def gerar_senha_segura(tamanho=16):
    """Gera uma senha forte usando o módulo secrets."""
    # Define os caracteres possíveis
    caracteres = string.ascii_letters + string.digits + string.punctuation
    
    # Gera a senha selecionando caracteres de forma segura
    senha = ''.join(secrets.choice(caracteres) for _ in range(tamanho))
    
    return senha

# Exemplo de uso
if __name__ == "__main__":
    nova_senha = gerar_senha_segura(20)
    print("Sua nova senha segura é:", nova_senha)
    
    # Gerando um token para recuperação de conta
    token_recuperacao = secrets.token_urlsafe(32)
    print("Token de segurança:", token_recuperacao)

Perguntas Frequentes

O módulo secrets está disponível em todas as versões do Python?

Não, ele foi introduzido no Python 3.6. Se você estiver usando versões muito antigas, precisará atualizar o seu ambiente de desenvolvimento.

Posso usar o secrets para criar nomes de arquivos aleatórios?

Sim, é uma ótima prática usar secrets.token_hex() para nomear arquivos de upload, evitando colisões e ataques de enumeração de arquivos.

Qual a vantagem de usar secrets.compare_digest?

Essa função compara duas strings em um tempo constante, independentemente de quão parecidas elas sejam. Isso impede que hackers descubram a senha medindo o tempo de resposta do servidor.

O module secrets substitui o módulo random completamente?

Não. Para simulações estatísticas, experimentos científicos ou o jogo da cobrinha em Python, o módulo random ainda é preferível por ser mais rápido.

Quantos caracteres uma senha segura deve ter?

Atualmente, recomenda-se um mínimo de 12 a 16 caracteres. Usando o secrets, você garante que esses caracteres sejam verdadeiramente aleatórios.

Como gerar um número aleatório entre dois valores específicos?

O secrets não tem uma função randint direta. Você pode usar minimo + secrets.randbelow(maximo - minimo + 1) para obter esse comportamento.

O segredo gerado pelo secrets é realmente impossível de quebrar?

Nada é impossível no mundo da computação, mas o secrets usa o nível mais alto de aleatoriedade que o sistema operacional pode oferecer, tornando o ataque inviável com a tecnologia atual.

Posso usar secrets para gerar chaves de criptografia AES?

Sim, secrets.token_bytes(32) é a forma ideal de gerar uma chave de 256 bits para algoritmos de criptografia simétrica com segurança.

Ao implementar essas técnicas, você garante que seus sistemas não apenas funcionem, mas resistam a tentativas de manipulação. A segurança não deve ser um pensamento posterior, mas a base de todo o seu processo de desenvolvimento em Python.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Conteúdo do artigo

    Artigos relacionados

    Fundamentos
    Foto do Leandro Hirt

    Como automatizar postagens no Twitter com Python

    Imagine a possibilidade de manter o seu perfil no Twitter (X) sempre ativo, compartilhando conteúdos relevantes, notícias de última hora

    Ler mais

    Tempo de leitura: 12 minutos
    26/02/2026
    Fundamentos
    Foto do Leandro Hirt

    Como criar um pacote pip instalável em Python passo a passo

    Criar seu próprio pacote Python e disponibilizá-lo para a comunidade através do gerenciador de pacotes pip é um dos marcos

    Ler mais

    Tempo de leitura: 8 minutos
    26/02/2026
    Fundamentos
    Foto do Leandro Hirt

    Como executar comandos do terminal com Python em 2 minutos

    Aprender a interagir com o sistema operacional é um dos grandes marcos na jornada de quem está decidindo aprender Python.

    Ler mais

    Tempo de leitura: 9 minutos
    25/02/2026
    Fundamentos
    Foto do Leandro Hirt

    Descubra como criar geradores eficientes com yield no Python

    Você já sentiu que seu computador travou ao tentar processar uma lista gigantesca de dados? Isso acontece porque, por padrão,

    Ler mais

    Tempo de leitura: 9 minutos
    25/02/2026
    Fundamentos
    Foto do Leandro Hirt

    Transforme seu script Python em .exe em 5 minutos

    Você criou um script incrível, automatizou tarefas repetitivas ou desenvolveu uma ferramenta útil, mas agora surge o problema: como compartilhar

    Ler mais

    Tempo de leitura: 10 minutos
    24/02/2026
    Fundamentos
    Foto do Leandro Hirt

    Como gerar e editar planilhas Excel com Python em minutos

    Gerar e editar planilhas Excel com Python em minutos é uma das habilidades mais valiosas para quem busca aumentar a

    Ler mais

    Tempo de leitura: 12 minutos
    23/02/2026