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
randomestringda biblioteca padrão - Constantes de string (
ascii_letters,digits,punctuation) random.choice()erandom.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
.txtprotegido
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.