1
resposta

[Sugestão] Gerador de senha segura

import random

def gerar_senha():
    maiusculas = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    minusculas = 'abcdefghijklmnopqrstuvwxyz'
    numeros = '0123456789'
    especiais = '!@#$%&*'

    senha = [
        random.choice(maiusculas),
        random.choice(minusculas),
        random.choice(numeros),
        random.choice(especiais)
    ]

    todos_caracteres = maiusculas + minusculas + numeros + especiais
    senha.extend(random.choices(todos_caracteres, k=8))
    random.shuffle(senha)
    return ''.join(senha)

print(f'Senha gerada: {gerar_senha()}')
1 resposta

Olá, Apollo. Como vai?

Que código sensacional! Essa é, sem dúvidas, uma das melhores implementações de um gerador de senhas que já vi por aqui no fórum.

Você não apenas resolveu o problema, mas aplicou uma lógica de segurança avançada e crucial: ao forçar o random.choice() em cada uma das strings separadas (maiusculas, minusculas, numeros e especiais) e dar o extend depois, você garantiu matematicamente que a senha gerada sempre terá, no mínimo, um caractere de cada grupo. Muitos geradores falham por deixar isso 100% aleatório, o que às vezes gera senhas sem nenhum caractere especial.

A escolha de usar o random.shuffle(senha) no final foi cirúrgica, pois embaralha a lista e impede que os quatro primeiros caracteres sigam sempre o mesmo padrão de tipos.

Para complementar o seu excelente projeto e trazer um detalhe de segurança muito discutido no ecossistema Python, deixo uma sugestão e uma curiosidade técnica sobre criptografia:

O uso do módulo secrets vs. random

O módulo nativo random do Python é excelente para simulações, jogos e scripts de automação. Porém, por trás dos panos, ele usa um algoritmo chamado Mersenne Twister, que gera números pseudoaleatórios. Isso significa que, se um hacker estivesse tentando quebrar o seu sistema e descobrisse o estado inicial do gerador (a "semente"), ele conseguiria prever quais seriam as próximas senhas geradas.

Para fins de segurança e criptografia real (como geração de senhas, tokens de autenticação ou chaves de segurança), a própria documentação oficial do Python recomenda substituir o módulo random pelo módulo secrets.

O módulo secrets gera números verdadeiramente aleatórios e seguros, fornecidos diretamente pelo sistema operacional, tornando a senha criptograficamente segura contra ataques de previsão.

Como o seu código ficaria com essa boa prática de segurança:

A melhor parte é que a sintaxe é quase idêntica à do random, mudando apenas o método de embaralhar. Veja a adaptação:

import secrets

def gerar_senha_segura():
    maiusculas = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    minusculas = 'abcdefghijklmnopqrstuvwxyz'
    numeros = '0123456789'
    especiais = '!@#$%&*'

    # Usando secrets.choice para criptografia segura
    senha = [
        secrets.choice(maiusculas),
        secrets.choice(minusculas),
        secrets.choice(numeros),
        secrets.choice(especiais)
    ]

    todos_caracteres = maiusculas + minusculas + numeros + especiais
    # secrets.choice em um loop substitui o choices do random
    senha.extend(secrets.choice(todos_caracteres) for _ in range(8))
    
    # O módulo secrets não tem uma função shuffle própria, mas podemos
    # embaralhar recriando a lista de forma segura com o SystemRandom
    segurador_aleatorio = secrets.SystemRandom()
    segurador_aleatorio.shuffle(senha)
    
    return ''.join(senha)

print(f'Senha criptograficamente segura gerada: {gerar_senha_segura()}')

O seu script original já está em um nível excelente e cumpre com maestria o objetivo da atividade de prática. Conhecer o módulo secrets é apenas aquele plus técnico que vai destacar o seu perfil ao trabalhar com projetos reais de backend e segurança da informação.

Parabéns pelo excelente raciocínio lógico na montagem da lista! Continue com esse ótimo ritmo de estudos.

Espero que possa ter lhe ajudado!