Código Espinoza Logo

Curso de Python: Generador de Contraseñas

Introducción

Hola a todos. Bienvenidos a este nuevo vídeo para el canal. Hoy vamos a comenzar con los proyectos en Python. Lo que vamos a hacer hoy es un generador de contraseñas. Será algo básico, pero útil. El programa pedirá al usuario el tamaño de la contraseña y generará una contraseña aleatoria de esa longitud.

Importar Librerías

Primero, vamos a importar las librerías necesarias. Usaremos las librerías string y random. La librería string nos proporciona conjuntos de caracteres como letras y dígitos, mientras que la librería random nos permite generar números aleatorios y seleccionar elementos aleatorios de una lista.

import string
import random

Uso de la Librería String

La librería string proporciona varios conjuntos de caracteres que podemos usar para generar contraseñas:

print(string.ascii_letters)  # abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.digits)         # 0123456789
print(string.punctuation)    # !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

Estos conjuntos incluyen letras mayúsculas y minúsculas, dígitos y caracteres especiales. Si quieres incluir la 'ñ', puedes añadirla manualmente a los conjuntos de caracteres.

Generar una Contraseña

A continuación, vamos a crear una función para generar una contraseña. Esta función tomará como parámetro la longitud deseada de la contraseña y devolverá una cadena aleatoria de esa longitud.

def generar_contraseña(longitud):
    caracteres = string.ascii_letters + string.digits + string.punctuation
    contraseña = ''
    for i in range(longitud):
        contraseña += random.choice(caracteres)
    return contraseña

# Ejemplo de uso
print(generar_contraseña(8))

En este ejemplo, concatenamos todas las letras, dígitos y símbolos en una sola cadena y luego seleccionamos caracteres aleatorios de esa cadena para formar la contraseña.

Interacción con el Usuario

Ahora vamos a mejorar el programa para que interactúe con el usuario, pidiéndole la longitud de la contraseña deseada:

def generar_contraseña(longitud):
    caracteres = string.ascii_letters + string.digits + string.punctuation
    contraseña = ''
    for i in range(longitud):
        contraseña += random.choice(caracteres)
    return contraseña

# Pedir al usuario la longitud de la contraseña
longitud = int(input("¿Cuál es la longitud de la contraseña deseada? "))
nueva_contraseña = generar_contraseña(longitud)
print("La nueva contraseña es:", nueva_contraseña)

Con este código, el programa solicitará al usuario que ingrese la longitud de la contraseña y luego generará y mostrará una contraseña de esa longitud.

Personalizar Caracteres

Si deseas personalizar los caracteres que se utilizan para generar la contraseña, puedes modificar la cadena de caracteres. Por ejemplo, puedes eliminar algunos símbolos que no quieras incluir:

caracteres = string.ascii_letters + string.digits + "!@#$%&*"

Esto hará que el programa solo utilice las letras, los dígitos y los símbolos que especifiques.

Ejemplo Completo

A continuación, se muestra el programa completo con todas las mejoras:

import string
import random

def generar_contraseña(longitud):
    caracteres = string.ascii_letters + string.digits + string.punctuation
    contraseña = ''
    for i in range(longitud):
        contraseña += random.choice(caracteres)
    return contraseña

# Pedir al usuario la longitud de la contraseña
longitud = int(input("¿Cuál es la longitud de la contraseña deseada? "))
nueva_contraseña = generar_contraseña(longitud)
print("La nueva contraseña es:", nueva_contraseña)

Validación de la Longitud de la Contraseña

Es importante validar la entrada del usuario para asegurarnos de que la longitud de la contraseña sea un número positivo. Podemos añadir esta validación al programa:

def generar_contraseña(longitud):
    caracteres = string.ascii_letters + string.digits + string.punctuation
    contraseña = ''
    for i in range(longitud):
        contraseña += random.choice(caracteres)
    return contraseña

# Pedir al usuario la longitud de la contraseña
try:
    longitud = int(input("¿Cuál es la longitud de la contraseña deseada? "))
    if longitud <= 0:
        print("La longitud debe ser un número positivo.")
    else:
        nueva_contraseña = generar_contraseña(longitud)
        print("La nueva contraseña es:", nueva_contraseña)
except ValueError:
    print("Por favor, ingrese un número válido.")

Con esta mejora, el programa validará que la entrada del usuario sea un número entero positivo.

Garantizar Caracteres Específicos

Podemos garantizar que la contraseña generada contenga al menos un carácter de cada tipo (letra mayúscula, letra minúscula, dígito y símbolo). Para ello, podemos modificar la función generar_contraseña:

def generar_contraseña(longitud):
    if longitud < 4:
        return "La longitud debe ser al menos 4 para incluir todos los tipos de caracteres."
    
    caracteres = string.ascii_letters + string.digits + string.punctuation
    contraseña = [
        random.choice(string.ascii_lowercase),
        random.choice(string.ascii_uppercase),
        random.choice(string.digits),
        random.choice(string.punctuation)
    ]
    for i in range(longitud - 4):
        contraseña.append(random.choice(caracteres))
    random.shuffle(contraseña)
    return ''.join(contraseña)

# Pedir al usuario la longitud de la contraseña
longitud = int(input("¿Cuál es la longitud de la contraseña deseada? "))
if longitud < 4:
    print("La longitud debe ser al menos 4.")
else:
    nueva_contraseña = generar_contraseña(longitud)
    print("La nueva contraseña es:", nueva_contraseña)

Con esta mejora, garantizamos que la contraseña incluya al menos un carácter de cada tipo.

Ejemplos Adicionales

Veamos algunos ejemplos adicionales de cómo generar contraseñas con diferentes configuraciones:

# Generar una contraseña de 12 caracteres
print(generar_contraseña(12))

# Generar una contraseña de 20 caracteres
print(generar_contraseña(20))

# Generar una contraseña con solo letras y dígitos
def generar_contraseña_simple(longitud):
    caracteres = string.ascii_letters + string.digits
    contraseña = ''.join(random.choice(caracteres) for i in range(longitud))
    return contraseña

print(generar_contraseña_simple(12))

En estos ejemplos, mostramos cómo generar contraseñas de diferentes longitudes y cómo generar contraseñas que solo incluyan letras y dígitos.

Interfaz de Usuario Básica

Podemos añadir una interfaz de usuario básica para el generador de contraseñas usando la biblioteca tkinter de Python:

import tkinter as tk
from tkinter import messagebox

def generar_contraseña(longitud):
    if longitud < 4:
        return "La longitud debe ser al menos 4 para incluir todos los tipos de caracteres."
    
    caracteres = string.ascii_letters + string.digits + string.punctuation
    contraseña = [
        random.choice(string.ascii_lowercase),
        random.choice(string.ascii_uppercase),
        random.choice(string.digits),
        random.choice(string.punctuation)
    ]
    for i in range(longitud - 4):
        contraseña.append(random.choice(caracteres))
    random.shuffle(contraseña)
    return ''.join(contraseña)

def generar():
    try:
        longitud = int(entry.get())
        if longitud < 4:
            messagebox.showerror("Error", "La longitud debe ser al menos 4.")
        else:
            contraseña = generar_contraseña(longitud)
            resultado_label.config(text=contraseña)
    except ValueError:
        messagebox.showerror("Error", "Por favor, ingrese un número válido.")

root = tk.Tk()
root.title("Generador de Contraseñas")

tk.Label(root, text="Longitud de la contraseña:").pack(pady=5)
entry = tk.Entry(root)
entry.pack(pady=5)

tk.Button(root, text="Generar", command=generar).pack(pady=20)
resultado_label = tk.Label(root, text="")
resultado_label.pack(pady=5)

root.mainloop()

Con este código, creamos una interfaz gráfica simple que permite al usuario ingresar la longitud de la contraseña y generar una contraseña con un clic de botón.

Resumen y Despedida

En este vídeo hemos aprendido cómo crear un generador de contraseñas en Python utilizando las librerías string y random. Hemos visto cómo interactuar con el usuario para obtener la longitud de la contraseña, cómo personalizar los caracteres utilizados y cómo añadir una interfaz gráfica básica. Espero que este proyecto les sea útil y que puedan adaptarlo a sus necesidades. ¡No olviden suscribirse al canal, dejar sus comentarios y darle like al vídeo! ¡Nos vemos en el próximo proyecto!