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.