Cifrado¶
📖 Definición¶
El cifrado es el proceso criptográfico que transforma información legible (texto claro) en información ininteligible (texto cifrado) mediante un algoritmo y una clave. Solo quien disponga de la clave apropiada puede descifrar los datos y recuperar el contenido original.
Se utiliza para proteger la confidencialidad de datos almacenados (en reposo) o transmitidos (en tránsito). Por sí solo, el cifrado no garantiza que los datos no hayan sido modificados ni quién los creó; para esas propiedades se emplean mecanismos de autenticación e integridad, como los códigos de autenticación de mensajes o las firmas digitales.
Cifrar no es codificar ni hacer hash
La codificación, como Base64, solo cambia la representación de los datos y no requiere una clave secreta. Un hash criptográfico es una función unidireccional y no está diseñado para recuperar el contenido original. El cifrado, en cambio, es reversible con la clave correspondiente.
⚙️ ¿Cómo funciona? / Principios fundamentales¶
- Algoritmo y clave: El algoritmo define las operaciones criptográficas; la clave controla el resultado. La seguridad debe depender de proteger las claves, no de mantener secreto el algoritmo.
- Cifrado y descifrado: El algoritmo combina el texto claro con la clave para producir texto cifrado. El descifrado utiliza la clave correspondiente para recuperar los datos.
- Elección del esquema:
- Cifrado simétrico: utiliza la misma clave secreta para cifrar y descifrar. Es eficiente para grandes volúmenes de datos; ejemplos actuales incluyen AES-GCM y ChaCha20-Poly1305.
- Cifrado asimétrico: utiliza un par de claves relacionadas: una pública y una privada. La clave pública puede cifrar datos que solo la privada correspondiente descifra. Se usa, entre otras cosas, para establecer claves y proteger comunicaciones.
- Cifrado autenticado: además de confidencialidad, permite detectar modificaciones. Para datos de aplicación, se prefieren modos AEAD como AES-GCM o ChaCha20-Poly1305.
🎯 Ejemplo práctico o escenario de demostración¶
Base64 no protege un secreto: cualquiera puede decodificarlo. Para información confidencial, utiliza una biblioteca criptográfica mantenida y protege la clave por separado de los datos cifrados.
from cryptography.fernet import Fernet
# En una aplicación real, genera la clave una vez y guárdala
# en un gestor de secretos, separada de los datos cifrados.
clave = Fernet.generate_key()
cifrador = Fernet(clave)
texto_claro = b"informacion confidencial"
texto_cifrado = cifrador.encrypt(texto_claro)
texto_recuperado = cifrador.decrypt(texto_cifrado)
Fernet, de la biblioteca cryptography, proporciona cifrado simétrico autenticado. Generar una clave nueva cada vez que se ejecuta el programa no es adecuado para datos que deban descifrarse después: la clave debe gestionarse y respaldarse de forma segura.
🛡️ Medidas de mitigación y buenas prácticas¶
- Usar bibliotecas y algoritmos reconocidos: evitar diseñar algoritmos propios y no utilizar algoritmos obsoletos como DES o modos inseguros.
- Proteger las claves: almacenarlas en un gestor de secretos o módulo de seguridad, limitar su acceso y establecer procesos de rotación y recuperación.
- Preferir cifrado autenticado: usar modos AEAD para detectar modificaciones; no reutilizar nonces cuando el algoritmo lo prohíba.
- Proteger los datos en tránsito y en reposo: configurar protocolos actuales como TLS y cifrar los dispositivos o soportes que contengan información sensible.
- No confundir cifrado con controles de acceso: restringir quién puede obtener las claves y registrar su uso; el cifrado no sustituye la autorización.