Tenho zero experiencia em Python, não sei codar de cabeça, estou me esforçando bastante para conseguir fazer isso, as vezes sinto que não estou evoluindo como deveria, me sinto perdido, isso me frusta um pouco, mas tenho usado dos exercícios para romper essa barreira de dificuldade e explorar as ideias que surgem na minha cabeça sem perder o foco e objetivo do exercicio.
Gosto muito de pensar em possibilidades e explorar ao máximo caminhos que não deixem o código "quebrar" durante a execução, acredito que isso melhora meu racional para soluções de problemas.
Tenho usado muito códigos de exercícios anteriores e pesquisa de como fazer determinados processos para atender ao exercícios proposto, penso sempre que é um projeto para entregar ao cliente.
# ================================================================================= #
# Biblioteca Python #
# ================================================================================= #
# Importa a classe datetime
from datetime import datetime
# Gera números aleatórios [criptografia], ideal para senhas, tokens e chaves
import secrets
# Conjuntos prontos de caracteres
import string
# ---> string.ascii_uppercase -> "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
# ---> string.ascii_lowercase -> "abcdefghijklmnopqrstuvwxyz"
# ---> string.digits -> "0123456789"
# Tipagem: ajuda a indicar que uma lista contém strings
from typing import List
# ================================================================================= #
# Funções do Programa #
# ================================================================================= #
# Obtém data e hora atuais
agora = datetime.now()
# Formata a data (dia/mês/ano)
data_formatada = agora.strftime("%d/%m/%Y")
# Formata a hora (hora:minuto:segundo)
hora_formatada = agora.strftime("%H:%M:%S")
'''Função | Validar senha gerada'''
def validar_senha(senha: str) -> dict:
"""Retorna um dicionário indicando se cada requisito foi atendido."""
has_upper = any(ch.isupper() for ch in senha)
has_lower = any(ch.islower() for ch in senha)
has_digit = any(ch.isdigit() for ch in senha)
especiais = set("!@#$%^&*()-_=+[]{};:,.?/")
has_special = any(ch in especiais for ch in senha)
return {
"Maiúscula": has_upper,
"Minúscula": has_lower,
"Número": has_digit,
"Especial": has_special,
"Tamanho ≥ 12": len(senha) >= 12,
}
'''Função | Gerar Senha'''
def gerar_senha(tamanho: int = 12) -> str:
# 4 Categorias: maiúscula, minúscula, número e caractere especial
if tamanho < 4:
raise ValueError('O tamanho mínimo precisa ser 4 para cumprir todos os requisitos.')
# Premissa | Conjuntos de caracteres
letras_maiusculas = string.ascii_uppercase # ABC...
letras_minusculas = string.ascii_lowercase # abc...
digitos = string.digits # 0123456789
especiais = "!@#$%^&*()-_=+[]{};:,.?/"
# Criar uma lista para senha, obter um caractere de cada categoria
senha: List[str] = [
secrets.choice(letras_maiusculas),
secrets.choice(letras_minusculas),
secrets.choice(digitos),
secrets.choice(especiais),
]
# Preencher o restante com um pool (conjunto de opções) de todos os tipos
pool = letras_maiusculas + letras_minusculas + digitos + especiais
for _ in range(tamanho - len(senha)):
senha.append(secrets.choice(pool))
# Embaralhar caracteres para não gerar uma senha previsível
secrets.SystemRandom().shuffle(senha)
# Senha gerada
return "".join(senha)
# ================================================================================= #
# Menu do Programa #
# ================================================================================= #
if __name__ == "__main__":
# Entrada
tamanho_senha = 12 # Sem interação com o usuário neste caso!
# Processamento
senha_gerada = gerar_senha(tamanho=tamanho_senha)
checklist = validar_senha(senha_gerada)
# Saída
print("=" * 38)
print('Password System'.center(38))
print("=" * 38)
print("Senha:")
print(senha_gerada)
print("=" * 38)
print(f'Senha gerada {data_formatada} às {hora_formatada}')
print("=" * 38)
# Resumo das validações com ✅ (largura automática para alinhamento)
print('Resumo das validações:')
largura = max(len(nome) for nome in checklist.keys()) + 2 # +2 para folga
for nome, ok in checklist.items():
status = "✅" if ok else "❌"
# • Nome do requisito alinhado à esquerda com largura fixa
print(f'• {nome:<{largura}} {status}')
print("=" * 38)
print('Programa encerrado com sucesso.')
print("=" * 38)