Skip to content

Python de Cero a Pro - Cap. 17 - Seguridad y Ofuscación

Este capítulo es el paso 3 de nuestra práctica secuencial.

  1. Módulo de Persistencia JSON 🗄️
  2. Módulo de Procesamiento de Fechas 🗓️
  3. Módulo de Seguridad y Ofuscación (Estás aquí) 📍
  4. Arquitectura de Modelos de Datos 🧩
  5. Interfaz de Usuario TUI Profesional 🎮

Módulo de Seguridad y Ofuscación (security.py) 🛡️

Section titled “Módulo de Seguridad y Ofuscación (security.py) 🛡️”

En este capítulo aprenderemos una verdad fundamental: Nunca guardes contraseñas en texto plano. Si alguien abre tu archivo JSON de usuarios, no debería poder leer las claves. Usaremos una técnica llamada Ofuscación, que es una forma ligera y ultrarrápida de “disfrazar” el texto.

modules/security.py
import base64
def obscure_password(password):
"""Ofusca la contraseña para que no sea legible en el JSON."""
if not password or password == "N/A":
return password
# Esta es nuestra "llave mágica" (Secret Key)
key = 0x55
# 1. Transformación XOR: Cambia los bits de cada letra
crypted = bytearray([b ^ key for b in password.encode('utf-8')])
# 2. Codificación Base64: Convierte lo binario en un texto ASCII
return base64.b64encode(crypted).decode('utf-8')
def reveal_password(obscured_password):
"""Restaura la contraseña ofuscada a su texto original."""
if not obscured_password or obscured_password == "N/A":
return obscured_password
try:
key = 0x55
# 1. Decodificar Base64: Volver al formato binario
crypted = base64.b64decode(obscured_password.encode('utf-8'))
# 2. Revertir XOR: Aplicar la misma llave para volver al original
original = bytearray([b ^ key for b in crypted])
return original.decode('utf-8')
except:
# Si algo falla (ej. datos viejos sin cifrar), retornamos tal cual
return obscured_password
# --- Ejemplo de Ejecución Directa (Para Pruebas) ---
if __name__ == "__main__":
print("--- Módulo de Seguridad Qué Pasa Linux ---")
password_original = "ClaveSecreta123!"
try:
# 1. Ofuscar
secreto = obscure_password(password_original)
print(f"🔒 Contraseña Ofuscada: {secreto}")
# 2. Revelar
revelada = reveal_password(secreto)
print(f"🔓 Contraseña Revelada: {revelada}")
# 3. Verificación
if password_original == revelada:
print("✅ ¡El proceso fue exitoso y los datos son íntegros!")
else:
print("❌ Los datos no coinciden. Revisa la llave secreta.")
except Exception as e:
print(f"❌ Error en el proceso de seguridad: {e}")

🧠 Conceptos Detallados para Principiantes 🔍

Section titled “🧠 Conceptos Detallados para Principiantes 🔍”

1. ¿Qué es XOR (^) y por qué es Simétrico?

Section titled “1. ¿Qué es XOR (^) y por qué es Simétrico?”

El operador XOR es un truco matemático de bits (ceros y unos). Es como un “espejo”:

  • Si aplicas A ^ B = C.
  • Entonces C ^ B te devuelve A mágicamente. Por eso la misma función nos sirve para cerrar el candado y para abrirlo. Además, es lo más eficiente que existe porque se resuelve directamente en el procesador.

Cuando aplicas el XOR, el resultado puede ser un “caracter extraño” que el archivo JSON no entienda (ej. un signo de interrogación al revés o un salto de línea). Base64 toma esos datos binarios y los convierte en letras normales (A-Z, 0-9) para que podamos guardarlos sin errores.

  • Ofuscación: “Disfrazamos” el dato. Es rápido y ligero. Ideal para proteger contraseñas de usuarios en aplicaciones locales de Qué Pasa Linux.
  • Encriptación: Usa matemáticas pesadas (como AES o RSA) y llaves mucho más complejas. Es más seguro pero requiere mucha más memoria y procesamiento.

¿Por qué esto es vital para un Sistema Robusto? 🛡️

Section titled “¿Por qué esto es vital para un Sistema Robusto? 🛡️”

Un profesional siempre diseña pensando en la seguridad. Al tener este módulo separado, garantizas que:

  • Tu sistema cumple con estándares básicos: No expones datos privados.
  • Es escalable: Si mañana necesitas cambiar la key o usar una librería de encriptación bancaria, solo tienes que cambiar este archivo y el resto de tu programa (Usuarios, Ventas, Perfiles) seguirá funcionando igual.

  1. Cambia la Llave: Modifica el valor de key = 0x55 por otro hexadecimal como 0x7F. Observa cómo tu programa ya no podrá leer las contraseñas ofuscadas con la llave de antes. ¡Ese es el poder del secreto!
  2. Experimenta con Base64: Usa la consola de Python para hacer base64.b64encode(b"Hola Mundo") y mira el texto que genera. Intenta decodificarlo de vuelta.
  3. Manejo Defensivo: Escribe una contraseña normal (sin cifrar) en tu archivo JSON y observa cómo reveal_password la detecta automáticamente y la devuelve sin errores gracias al bloque try/except.

Siguiente: Arquitectura de Modelos de Datos