Exemplo de codigo em Python para um gerador de senhas seguras

Pessoal em meus estudos de Python fiz esse gerador de senhas, onde o usuario escolhe a quatidade de letras, números e caracteres especiais.
Gostaria de propor um desafio a comunidade dev de criarmos uma aplicação onde poderemos gerar nossas senhas e também armazena-las em um cofre.
E aí pessoal bora programar?

link do repositorio

#Password Generator
import random
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
symbols = ['!', '#', '$', '%', '&', '(', ')', '*', '+', '>', '<', '^', '~', '@', '-', '_', 'ç', 'Ç','`', '/', '|', 'ª', 'º', '¿',]

print("Welcome to the PyPassword Generator!")
# quantas letras quer em sua senha?
nr_letters= int(input("How many letters would you like in your password?\n")) 
# quantos simbolos quer em sua senha?
nr_symbols = int(input(f"How many symbols would you like?\n"))
# quantos numeros quem em sua senha?
nr_numbers = int(input(f"How many numbers would you like?\n"))

password_list = []

for char in range(1, nr_letters + 1):
  password_list.append(random.choice(letters))

for char in range(1, nr_symbols + 1):
  password_list += random.choice(symbols)

for char in range(1, nr_numbers + 1):
  password_list += random.choice(numbers)

# print(password_list)
  random.shuffle(password_list)
# print(password_list)

password = ""
for char in password_list:
  password += char

print(f"Your password is: {password}")

import time
time.sleep(60)

Esse artigo do Baboo explica o que realmente é uma senha forte, serial legal se basear no formato de senhas que ele da de exemplo para implementar no script:

https://www.baboo.com.br/forum/index.php?/topic/671-aprenda-a-criar-senhas-fortes/

Vlw gabrielSni, vem com a gente desenvolver isso!!!

Desculpe ser o estraga-prazeres, mas a própria documentação oficial do módulo random tem aviso bem claro:

Warning: The pseudo-random generators of this module should not be used for security purposes. For security or cryptographic uses, see the secrets module.

Ou seja, o módulo random não deve ser usado para aplicações de segurança ou criptografia, e sugere o uso do módulo secrets para isso (disponível a partir do Python 3.6). Na documentação já tem algumas "receitas" prontas para gerar senhas. Adaptando para o seu caso, seria algo como:

import secrets
from string import ascii_letters, digits

symbols = '!#$%&()*+><^~@-_çÇ`/|ªº¿'
alphabet = ascii_letters + digits + symbols

# eu não colocaria quantidades específicas de cada tipo (X letras, Y números, etc)
# talvez a quantidade mínima para alguns (abaixo vejo se tem pelo menos 3 dígitos)
# em vez disso, verifico se tem pelo menos um de cada
tamanho_senha = 16
while True:
    password = ''.join(secrets.choice(alphabet) for _ in range(tamanho_senha))
    if (any(c.islower() for c in password) # tem alguma letra minúscula
            and any(c.isupper() for c in password) # tem alguma letra maiúscula
            and any(c in symbols for c in password) # tem algum símbolo
            and sum(c.isdigit() for c in password) >= 3): # tem pelo menos 3 dígitos
        break # deu certo, sai do while

print(password)

Repare que as letras e dígitos já estão prontas no módulo string.

No caso eu só vejo se tem pelo menos uma letra maiúscula, minúscula e um símbolo, e vejo se tem pelo menos 3 dígitos. Não é difícil adaptar para o seu caso, que tem quantidades fixas. Por exemplo:

import secrets
from string import ascii_letters, digits

symbols = '!#$%&()*+><^~@-_çÇ`/|ªº¿'
alphabet = ascii_letters + digits + symbols

qtd_letras = 10
qtd_digitos = 4
qtd_simbolos = 2

tamanho_senha = qtd_simbolos + qtd_digitos + qtd_letras
while True:
    password = ''.join(secrets.choice(alphabet) for _ in range(tamanho_senha))
    if (sum(c.isalpha() for c in password) == qtd_letras
            and sum(c in symbols for c in password) == qtd_simbolos
            and sum(c.isdigit() for c in password) == qtd_digitos): # tem pelo menos 3 dígitos
        break # deu certo, sai do while

print(password)

Quem quiser participar dessa criação por favor entre em contato que adiciono como colaborador.

Quero colaborar! Meu nick no github é Bluh7
Blz Bluh7 adicionado, seja bem vindo!!!