Programador Leigo
Projetos 7 min leitura 16 MAR 2026

Como criar um gerador de senhas em Python

Crie um gerador de senhas seguras e aleatórias com controle de tamanho e tipos de caracteres.


O que vamos construir?

Um programa que gera senhas aleatórias e seguras. O usuário escolhe o tamanho da senha e quais tipos de caracteres incluir: letras maiúsculas, minúsculas, números e símbolos. É um projeto prático que você pode usar no dia a dia.

Os módulos que vamos usar

Python tem dois módulos que facilitam esse projeto:

import random
import string

O módulo string tem constantes prontas com todos os caracteres que precisamos:

print(string.ascii_lowercase)   # abcdefghijklmnopqrstuvwxyz
print(string.ascii_uppercase)   # ABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.digits)            # 0123456789
print(string.punctuation)       # !@#$%^&*()... e outros simbolos

Gerando uma senha simples

Na forma mais básica, gerar uma senha é escolher caracteres aleatórios de um conjunto:

import random
import string

caracteres = string.ascii_letters + string.digits
senha = ""

for _ in range(12):
    senha += random.choice(caracteres)

print(senha)  # algo como: kR7mNp2xWq4j

A função random.choice() escolhe um caractere aleatório da string. O _ no for indica que não precisamos usar a variável do loop.

Deixando o usuário escolher

Vamos permitir que o usuário configure a senha:

def pedir_configuracao():
    while True:
        try:
            tamanho = int(input("Tamanho da senha (8-50): "))
            if 8 <= tamanho <= 50:
                break
            print("Escolha entre 8 e 50 caracteres.")
        except ValueError:
            print("Digite um numero.")

    usar_maiusculas = input("Incluir maiusculas? (s/n): ").lower() == "s"
    usar_numeros = input("Incluir numeros? (s/n): ").lower() == "s"
    usar_simbolos = input("Incluir simbolos? (s/n): ").lower() == "s"

    return tamanho, usar_maiusculas, usar_numeros, usar_simbolos

A expressão input(...).lower() == "s" retorna True ou False — um jeito limpo de converter input em booleano.

Montando o conjunto de caracteres

Com base nas escolhas do usuário, montamos a string de caracteres disponíveis:

def montar_caracteres(maiusculas, numeros, simbolos):
    caracteres = string.ascii_lowercase  # sempre inclui minusculas

    if maiusculas:
        caracteres += string.ascii_uppercase
    if numeros:
        caracteres += string.digits
    if simbolos:
        caracteres += string.punctuation

    return caracteres

Gerando a senha com garantias

Um detalhe importante: se o usuário pediu números e símbolos, a senha deve ter pelo menos um de cada. Caso contrário, uma senha de 8 caracteres poderia sair sem nenhum número, por puro azar.

def gerar_senha(tamanho, maiusculas, numeros, simbolos):
    caracteres = montar_caracteres(maiusculas, numeros, simbolos)

    # Garantir pelo menos um de cada tipo solicitado
    obrigatorios = [random.choice(string.ascii_lowercase)]

    if maiusculas:
        obrigatorios.append(random.choice(string.ascii_uppercase))
    if numeros:
        obrigatorios.append(random.choice(string.digits))
    if simbolos:
        obrigatorios.append(random.choice(string.punctuation))

    # Preencher o restante
    restante = tamanho - len(obrigatorios)
    for _ in range(restante):
        obrigatorios.append(random.choice(caracteres))

    # Embaralhar para nao ficar previsivel
    random.shuffle(obrigatorios)

    return "".join(obrigatorios)

O random.shuffle() embaralha a lista no lugar, garantindo que os caracteres obrigatórios não fiquem sempre no início.

Código completo

import random
import string


def montar_caracteres(maiusculas, numeros, simbolos):
    caracteres = string.ascii_lowercase

    if maiusculas:
        caracteres += string.ascii_uppercase
    if numeros:
        caracteres += string.digits
    if simbolos:
        caracteres += string.punctuation

    return caracteres


def gerar_senha(tamanho, maiusculas, numeros, simbolos):
    caracteres = montar_caracteres(maiusculas, numeros, simbolos)

    obrigatorios = [random.choice(string.ascii_lowercase)]

    if maiusculas:
        obrigatorios.append(random.choice(string.ascii_uppercase))
    if numeros:
        obrigatorios.append(random.choice(string.digits))
    if simbolos:
        obrigatorios.append(random.choice(string.punctuation))

    restante = tamanho - len(obrigatorios)
    for _ in range(restante):
        obrigatorios.append(random.choice(caracteres))

    random.shuffle(obrigatorios)
    return "".join(obrigatorios)


def main():
    print("=== GERADOR DE SENHAS ===")
    print()

    while True:
        try:
            tamanho = int(input("Tamanho da senha (8-50): "))
            if 8 <= tamanho <= 50:
                break
            print("Escolha entre 8 e 50 caracteres.")
        except ValueError:
            print("Digite um numero.")

    maiusculas = input("Incluir maiusculas? (s/n): ").lower() == "s"
    numeros = input("Incluir numeros? (s/n): ").lower() == "s"
    simbolos = input("Incluir simbolos? (s/n): ").lower() == "s"

    print()
    print("Senhas geradas:")
    print("-" * 40)

    for i in range(5):
        senha = gerar_senha(tamanho, maiusculas, numeros, simbolos)
        print(f"  {i + 1}. {senha}")

    print("-" * 40)
    print("Copie a que mais gostar!")


main()

O programa gera 5 senhas de uma vez para o usuário escolher a que preferir.

O que você aprendeu

  • Módulos random e string da biblioteca padrão
  • Constantes de string (ascii_letters, digits, punctuation)
  • random.choice() e random.shuffle()
  • Construção incremental de strings com listas e join()

Dicas para ir além

  • Copiar para a área de transferência: use o módulo pyperclip
  • Verificar força: avalie se a senha é fraca, média ou forte
  • Salvar em arquivo: grave as senhas em um arquivo .txt protegido

Conclusão

Você criou uma ferramenta útil de verdade: um gerador de senhas que pode usar no seu dia a dia. No próximo artigo, vamos construir o clássico jogo da velha para dois jogadores.

Continue lendo

Compartilhar