Preferi utilizar o secrets ao inves do random por motivos de que eu queria algo que fosse realmente imprevisivel. Estou orientando meus estudos à area de segurança e esse excercicio veio a calhar como codigo base para um projeto no qual estou trabalhando.
import secrets
import string
# Generates a function with a result of a predetermined size.
def generate_password(length=12):
# Since there are four sets of characters, the code must generate at least one of each, that is, at least 4.
if length < 4 :
raise ValueError("Password must have at least 4 characters.")
# Character sets
upper = string.ascii_uppercase
lower = string.ascii_lowercase
digits = string.digits
special = string.punctuation
# Ensure you have at least one of each type.
password = [
secrets.choice(upper),
secrets.choice(lower),
secrets.choice(digits),
secrets.choice(special)
]
# Fill in the rest.
all_chars = upper + lower + digits + special
password += [secrets.choice(all_chars) for _ in range(length - 4)]
# To shuffle things up so they don't become predictable.
secrets.SystemRandom().shuffle(password)
return "".join(password)
print("Generated password:", generate_password())