Saltar a contenido

Cifrado

Categoría Criptografía
Autor / Colaborador @mgarlop

📖 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

  1. 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.
  2. 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.
  3. Elección del esquema:
  4. 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.
  5. 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.
  6. 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.

import base64

secreto = "credencial-confidencial"
representacion = base64.b64encode(secreto.encode("utf-8"))

# Esto es reversible sin ninguna clave y no proporciona confidencialidad.
print(base64.b64decode(representacion).decode("utf-8"))
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.

🔗 Referencias y enlaces de interés