Ir al contenido principal

Generador de contraseñas

Introducción

En la era digital, contar con contraseñas seguras es fundamental para proteger nuestra información personal. Sin embargo, crear manualmente contraseñas robustas puede ser complicado. Python nos ofrece herramientas perfectas para automatizar este proceso mediante la programación de un generador de contraseñas personalizable. Este proyecto práctico nos permitirá aplicar varios conceptos aprendidos anteriormente, como funciones, cadenas, listas y módulos de la biblioteca estándar, para crear una utilidad de uso diario.

Planteamiento del proyecto

Análisis de requisitos

Para crear un generador de contraseñas eficaz, necesitamos definir qué características debe tener:

  • Permitir elegir la longitud de la contraseña
  • Incluir diferentes tipos de caracteres (mayúsculas, minúsculas, números, símbolos)
  • Generar contraseñas aleatorias pero seguras
  • Ofrecer una interfaz sencilla para el usuario

Importación de módulos necesarios

Python cuenta con varios módulos útiles para este proyecto:

import random  # Para la generación de números aleatorios
import string  # Contiene conjuntos de caracteres predefinidos

Implementación del generador básico

Veamos cómo crear una función simple que genere contraseñas:

def generar_contrasena(longitud=12, usar_mayusculas=True, usar_minusculas=True, 
                      usar_numeros=True, usar_simbolos=True):
    """
    Genera una contraseña aleatoria según los parámetros especificados.
    
    Args:
        longitud: Número de caracteres de la contraseña
        usar_mayusculas: Incluir letras mayúsculas
        usar_minusculas: Incluir letras minúsculas
        usar_numeros: Incluir dígitos numéricos
        usar_simbolos: Incluir caracteres especiales
    
    Returns:
        Una cadena con la contraseña generada
    """
    # Definimos los conjuntos de caracteres disponibles
    caracteres = ""
    
    if usar_mayusculas:
        caracteres += string.ascii_uppercase  # ABCDEFGHIJKLMNOPQRSTUVWXYZ
    if usar_minusculas:
        caracteres += string.ascii_lowercase  # abcdefghijklmnopqrstuvwxyz
    if usar_numeros:
        caracteres += string.digits  # 0123456789
    if usar_simbolos:
        caracteres += string.punctuation  # !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
    
    # Verificamos que al menos un conjunto de caracteres esté seleccionado
    if not caracteres:
        return "Error: Debes seleccionar al menos un tipo de caracteres"
    
    # Generamos la contraseña seleccionando caracteres aleatorios
    contrasena = "".join(random.choice(caracteres) for _ in range(longitud))
    
    return contrasena

Mejorando la seguridad

Para asegurar que la contraseña contenga al menos un carácter de cada tipo seleccionado:

def generar_contrasena_segura(longitud=12, usar_mayusculas=True, usar_minusculas=True, 
                             usar_numeros=True, usar_simbolos=True):
    """Genera una contraseña segura garantizando la presencia de cada tipo de carácter."""
    # Verificamos que la longitud sea suficiente
    tipos_seleccionados = sum([usar_mayusculas, usar_minusculas, usar_numeros, usar_simbolos])
    if longitud < tipos_seleccionados:
        return "Error: La longitud debe ser al menos igual al número de tipos de caracteres"
    
    # Creamos listas con los diferentes tipos de caracteres
    caracteres_obligatorios = []
    
    if usar_mayusculas:
        caracteres_obligatorios.append(random.choice(string.ascii_uppercase))
    if usar_minusculas:
        caracteres_obligatorios.append(random.choice(string.ascii_lowercase))
    if usar_numeros:
        caracteres_obligatorios.append(random.choice(string.digits))
    if usar_simbolos:
        caracteres_obligatorios.append(random.choice(string.punctuation))
    
    # Generamos el resto de caracteres aleatorios
    caracteres_disponibles = ""
    if usar_mayusculas:
        caracteres_disponibles += string.ascii_uppercase
    if usar_minusculas:
        caracteres_disponibles += string.ascii_lowercase
    if usar_numeros:
        caracteres_disponibles += string.digits
    if usar_simbolos:
        caracteres_disponibles += string.punctuation
    
    caracteres_restantes = [random.choice(caracteres_disponibles) 
                           for _ in range(longitud - len(caracteres_obligatorios))]
    
    # Combinamos y mezclamos todos los caracteres
    todos_caracteres = caracteres_obligatorios + caracteres_restantes
    random.shuffle(todos_caracteres)
    
    return "".join(todos_caracteres)

Interfaz para el usuario

Creemos una interfaz sencilla para que el usuario pueda interactuar con el generador:

def main():
    print("=== GENERADOR DE CONTRASEÑAS ===")
    
    try:
        longitud = int(input("Longitud de la contraseña (8-50): "))
        if longitud < 8 or longitud > 50:
            print("La longitud debe estar entre 8 y 50 caracteres.")
            return
    except ValueError:
        print("Error: Debes introducir un número entero.")
        return
    
    usar_mayusculas = input("¿Incluir letras mayúsculas? (s/n): ").lower() == 's'
    usar_minusculas = input("¿Incluir letras minúsculas? (s/n): ").lower() == 's'
    usar_numeros = input("¿Incluir números? (s/n): ").lower() == 's'
    usar_simbolos = input("¿Incluir símbolos especiales? (s/n): ").lower() == 's'
    
    if not any([usar_mayusculas, usar_minusculas, usar_numeros, usar_simbolos]):
        print("Error: Debes seleccionar al menos un tipo de caracteres.")
        return
    
    contrasena = generar_contrasena_segura(
        longitud, 
        usar_mayusculas, 
        usar_minusculas, 
        usar_numeros, 
        usar_simbolos
    )
    
    print("\nTu contraseña generada es:")
    print(contrasena)
    
    # Evaluación básica de seguridad
    nivel = "baja"
    if longitud >= 12 and sum([usar_mayusculas, usar_minusculas, usar_numeros, usar_simbolos]) >= 3:
        nivel = "alta"
    elif longitud >= 8 and sum([usar_mayusculas, usar_minusculas, usar_numeros, usar_simbolos]) >= 2:
        nivel = "media"
    
    print(f"Nivel de seguridad estimado: {nivel}")

if __name__ == "__main__":
    main()

Ampliación del proyecto

Podemos añadir funcionalidades adicionales:

def guardar_contrasena(contrasena, sitio, usuario, archivo="contrasenas.txt"):
    """Guarda la contraseña generada en un archivo de texto."""
    import datetime
    
    fecha = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    
    try:
        with open(archivo, "a") as f:
            f.write(f"Sitio: {sitio} | Usuario: {usuario} | Contraseña: {contrasena} | Fecha: {fecha}\n")
        return True
    except Exception as e:
        print(f"Error al guardar la contraseña: {e}")
        return False

# Función para generar múltiples contraseñas
def generar_multiples_contrasenas(cantidad, longitud, usar_mayusculas, 
                                usar_minusculas, usar_numeros, usar_simbolos):
    """Genera varias contraseñas con las mismas características."""
    return [generar_contrasena_segura(longitud, usar_mayusculas, 
                                   usar_minusculas, usar_numeros, usar_simbolos) 
            for _ in range(cantidad)]

Resumen

Hemos creado un generador de contraseñas funcional que permite personalizar las características de seguridad según las necesidades del usuario. Este proyecto demuestra cómo aplicar conceptos fundamentales de Python, como funciones, módulos de la biblioteca estándar (random y string), manejo de cadenas y entrada/salida básica en una aplicación práctica. Además, introduce conceptos de aleatoriedad y seguridad que son valiosos en el desarrollo de aplicaciones modernas. En el próximo artículo, exploraremos un sistema más complejo de gestión de inventario que expandirá nuestras habilidades hacia la programación orientada a objetos y la persistencia de datos.