Python de Cero a Pro - Cap. 17 - Seguridad y Ofuscación
Serie: Arquitectura de Sistemas 🏗️
Section titled “Serie: Arquitectura de Sistemas 🏗️”Este capítulo es el paso 3 de nuestra práctica secuencial.
- Módulo de Persistencia JSON 🗄️
- Módulo de Procesamiento de Fechas 🗓️
- Módulo de Seguridad y Ofuscación (Estás aquí) 📍
- Arquitectura de Modelos de Datos 🧩
- 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.
El Código Completo
Section titled “El Código Completo”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 ^ Bte devuelveAmá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.
2. Base64: El Traductor de Datos
Section titled “2. Base64: El Traductor de Datos”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.
3. Ofuscación vs Encriptación
Section titled “3. Ofuscación vs Encriptación”- 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
keyo 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.
Ejercicios de Práctica 📝
Section titled “Ejercicios de Práctica 📝”- Cambia la Llave: Modifica el valor de
key = 0x55por otro hexadecimal como0x7F. Observa cómo tu programa ya no podrá leer las contraseñas ofuscadas con la llave de antes. ¡Ese es el poder del secreto! - 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. - Manejo Defensivo: Escribe una contraseña normal (sin cifrar) en tu archivo JSON y observa cómo
reveal_passwordla detecta automáticamente y la devuelve sin errores gracias al bloquetry/except.
Siguiente: Arquitectura de Modelos de Datos