47. Aplicaciones en criptografía y ciberseguridad

La matemática discreta proporciona estructuras para proteger información, verificar integridad, controlar accesos y modelar amenazas. La seguridad real combina esas bases con protocolos, bibliotecas auditadas, operaciones rigurosas y evaluación continua.

47.1 Introducción

La ciberseguridad busca proteger sistemas, datos y servicios frente a errores, fallas y acciones no autorizadas. La criptografía es una parte central, pero no la única: también importan autenticación, autorización, validación de entradas, segmentación, monitoreo y respuesta ante incidentes.

Las congruencias, los números primos, los grafos, la lógica booleana, los autómatas y el principio del palomar aparecen en distintas capas de estas soluciones.

47.2 Objetivos de seguridad

Un sistema puede necesitar proteger varias propiedades simultáneamente:

Confidencialidad: impedir lectura no autorizada.
Integridad: detectar cambios no autorizados.
Disponibilidad: mantener el servicio operativo.
Autenticidad: verificar una identidad u origen.
Autorización: limitar acciones según permisos.
Trazabilidad: registrar acciones relevantes.

Un mecanismo puede cubrir una propiedad y dejar otras sin resolver. Cifrar datos no controla quién puede pedirlos; una firma no oculta su contenido; un registro de eventos no evita por sí mismo un incidente.

47.3 Aritmética modular y criptografía

Las operaciones modulares permiten trabajar con potencias y productos dentro de conjuntos finitos. Sistemas de clave pública y acuerdos de claves usan estas operaciones con parámetros grandes y cuidadosamente seleccionados.

Potenciación modular: ae mod m.
Inverso modular: a-1 mod m cuando mcd(a, m) = 1.

El algoritmo extendido de Euclides encuentra inversos.
La exponenciación rápida controla el costo de exponentes grandes.

Los ejemplos numéricos pequeños de temas anteriores son didácticos. La seguridad depende de tamaños, parámetros, formatos y protocolos concretos, no solo de aplicar una fórmula modular.

47.4 Cifrado, codificación y hash

Estos conceptos se confunden con facilidad, pero resuelven problemas distintos:

Codificación: representa datos para transporte o almacenamiento; no oculta secretos.
Cifrado: transforma datos para que solo quien tiene la clave adecuada pueda recuperarlos.
Hash criptográfico: resumen de longitud fija; no permite recuperar el mensaje.
MAC o firma: autentica e integra datos bajo un esquema de claves.

Convertir texto a Base64 no cifra el contenido. Aplicar un hash no permite recuperar el mensaje original y un hash público por sí solo no prueba quién produjo el dato.

47.5 Funciones hash criptográficas

Una función hash criptográfica transforma una entrada de longitud variable en un resumen de longitud fija. Sus propiedades deseables incluyen resistencia práctica a preimágenes, segundas preimágenes y colisiones.

Entrada: cualquier mensaje.
Salida: resumen fijo.

Pequeño cambio de entrada → resumen muy diferente.
Las colisiones existen por el principio del palomar,
pero deben ser inviables de encontrar en la práctica.

Un hash sirve para verificar integridad cuando el resumen esperado proviene de una fuente confiable. Si un atacante puede cambiar el archivo y el hash publicado junto a él, la comparación no ofrece autenticidad.

47.6 Calcular un hash con Web Crypto

async function sha256Hex(texto) {
  const datos = new TextEncoder().encode(texto);
  const resumen = await crypto.subtle.digest("SHA-256", datos);

  return [...new Uint8Array(resumen)]
    .map(byte => byte.toString(16).padStart(2, "0"))
    .join("");
}

sha256Hex("mensaje").then(console.log);

El ejemplo muestra el uso de una API criptográfica del navegador para una operación de resumen. No convierte un hash simple en un sistema de autenticación, almacenamiento de contraseñas o firma digital; cada objetivo requiere un esquema específico.

47.7 Contraseñas

Las contraseñas no deben almacenarse en texto plano ni protegerse con un hash rápido genérico aplicado directamente. El almacenamiento seguro usa funciones de derivación de claves diseñadas para contraseñas, con sal única y parámetros de costo.

Sal: valor aleatorio distinto que acompaña al hash.
Función de contraseñas: hace costoso probar muchas claves.
Verificación: se recalcula con la sal y se compara con el registro.

La sal no necesita ser secreta; evita reutilizar resultados entre usuarios.

La implementación concreta debe delegarse a bibliotecas y plataformas mantenidas. También importan autenticación multifactor, recuperación de cuenta, límites de intentos y protección del canal de acceso.

47.8 Cifrado autenticado

El cifrado para datos reales debe proteger confidencialidad e integridad. Sin autenticación, un atacante puede modificar un texto cifrado y provocar cambios predecibles o errores al descifrar.

Cifrado autenticado:
cifra el contenido y verifica que no fue alterado.

Datos asociados autenticados:
metadatos que se verifican pero no se cifran.
Ejemplo: versión de protocolo o identificador de mensaje.

No se deben combinar manualmente un cifrador, un hash y una clave esperando obtener un protocolo seguro. Se usan modos y APIs de cifrado autenticado diseñados y revisados para ese propósito.

47.9 Firmas digitales

Una firma digital permite verificar que quien posee una clave privada autorizó un mensaje y que el mensaje no cambió desde la firma. La verificación se hace con la clave pública correspondiente.

Clave privada: crea firma.
Clave pública: verifica firma.

La firma se asocia a un mensaje o a su resumen bajo un formato definido.
Modificar el mensaje debe invalidar la verificación.

Las firmas se usan para actualizaciones de software, documentos, artefactos de despliegue y mensajes. La seguridad incluye proteger la clave privada y verificar correctamente la cadena de confianza de la clave pública.

47.10 Aleatoriedad y nonces

Un nonce es un valor que debe usarse una sola vez en el contexto definido por un protocolo. Puede evitar repeticiones y ayudar a distinguir mensajes o cifrados con el mismo contenido.

Nonce: número o valor único por operación según el esquema.
Reto: valor impredecible enviado para comprobar actualidad.
Sal: valor único usado en derivación de contraseñas.

No son sinónimos, aunque todos se relacionen con unicidad o aleatoriedad.

Reutilizar un nonce donde el algoritmo exige unicidad puede comprometer la seguridad. La generación y el almacenamiento de estos valores debe seguir estrictamente las reglas de la primitiva utilizada.

47.11 Autenticación y autorización

Autenticar es comprobar quién presenta una identidad; autorizar es decidir qué puede hacer esa identidad. Son procesos distintos.

Autenticación: «¿quién eres?».
Autorización: «¿puedes realizar esta acción sobre este recurso?».

Un usuario autenticado no debe obtener automáticamente todos los permisos.
La autorización se evalúa en cada operación sensible.

Los modelos de roles, atributos o listas de control de acceso se expresan con conjuntos, relaciones y reglas booleanas. El principio de mínimo privilegio concede solo las capacidades necesarias.

47.12 Permisos como grafo

Las relaciones entre identidades, grupos, roles y recursos forman un grafo dirigido. Una arista puede representar pertenencia, herencia, delegación o permiso.

Usuario → miembroDe → Grupo.
Grupo → tiene → Rol.
Rol → permite → Recurso.

Una consulta de permisos sigue relaciones y reglas de denegación definidas por el modelo.

Los grafos de permisos deben evitar herencias inesperadas y ciclos de delegación. Una relación aparentemente inocente puede abrir una ruta de privilegio no prevista, por lo que el modelo debe revisarse como parte de la seguridad.

47.13 Protocolos como máquinas de estados

Un protocolo seguro define mensajes, estados y transiciones permitidas. Un participante no debería aceptar un mensaje fuera de contexto ni repetir una transición ya cerrada.

Estado inicial → autenticando → sesión establecida → cerrada.

Mensajes válidos dependen del estado actual.
Un mensaje inesperado debe rechazarse o tratarse de forma segura.

Modelar protocolos como autómatas ayuda a detectar estados omitidos, reintentos ambiguos y secuencias que podrían permitir repetición o confusión de mensajes.

47.14 Validación de entradas

Las entradas externas son cadenas que deben respetar formatos, longitudes y reglas de negocio. Autómatas, gramáticas y expresiones regulares ayudan a describir la parte sintáctica de esas validaciones.

Validar formato no equivale a confiar en el dato.

Aplicar límites de longitud y tipo.
Usar parsers para formatos estructurados.
Parametrizar consultas y comandos.
Verificar autorización después de validar la sintaxis.

Una expresión regular debe ser simple, anclada cuando se valida una cadena completa y probada frente a entradas adversas. La validación es una capa, no la única defensa contra acciones no autorizadas.

47.15 Códigos de detección de errores

Las sumas de comprobación, paridad y códigos de redundancia usan aritmética modular y operaciones sobre bits para detectar errores accidentales durante almacenamiento o transmisión.

Bit de paridad: detecta algunos errores simples.
Checksum: resume bloques de datos.
CRC: usa operaciones polinómicas sobre bits.

Detección de errores accidentales no equivale a autenticación contra un atacante.

Un atacante que puede modificar datos puede recalcular una suma de comprobación ordinaria. Para resistencia frente a manipulación intencional se usan MACs o firmas digitales con claves.

47.16 Redes y segmentación

Una infraestructura se puede analizar como un grafo de dispositivos, servicios y enlaces. La segmentación limita qué caminos de red están permitidos entre componentes.

Vértices: servicios, equipos, cuentas o redes.
Aristas: comunicaciones permitidas.

Reducir aristas innecesarias reduce superficie de ataque.
Puentes y nodos de articulación revelan puntos críticos.

La segmentación no reemplaza autenticación ni actualizaciones, pero limita el alcance de un incidente. El diseño debe considerar dependencias legítimas para no bloquear operaciones esenciales.

47.17 Registro y detección de anomalías

Los registros de eventos forman secuencias y grafos de relaciones: una cuenta inicia sesión, accede a un recurso, modifica una configuración o llama a un servicio. Analizar patrones puede revelar desviaciones.

Señales posibles:
secuencia de estados inválida;
accesos fuera de horario definido;
rutas de privilegio inusuales;
aumento anómalo de fallos.

Una señal requiere investigación, no una conclusión automática.

La observabilidad debe proteger la privacidad, restringir el acceso a registros y definir retención adecuada. Los datos de monitoreo también son información sensible.

47.18 Modelado de amenazas

El modelado de amenazas identifica activos, actores, fronteras de confianza, rutas de ataque y controles. Los diagramas de flujo y grafos ayudan a hacer visibles dependencias que no aparecen en un componente aislado.

Activos: datos, claves, servicios y operaciones valiosas.
Fronteras: cambios de confianza entre usuarios, procesos o redes.
Amenazas: acciones que comprometen un objetivo.
Controles: medidas para prevenir, detectar o responder.

El propósito no es adivinar cada ataque posible, sino razonar sistemáticamente sobre dónde aplicar defensas y cómo verificar que cubren los riesgos relevantes.

47.19 Implementación segura

La mayoría de los fallos de seguridad no se resuelven inventando una primitiva criptográfica. Se reducen usando bibliotecas mantenidas, configuraciones seguras, actualizaciones, gestión de secretos y pruebas.

No diseñar algoritmos criptográficos propios.
No reutilizar claves, nonces ni secretos fuera de su contexto.
No registrar credenciales o datos sensibles.
Separar secretos del código fuente.
Revisar dependencias y permisos.

La matemática permite entender por qué funcionan los mecanismos, pero la seguridad de producción requiere ingeniería de software, operación y respuesta a incidentes.

47.20 Estrategia de seguridad

  1. Identificar activos, usuarios, flujos de datos y fronteras de confianza.
  2. Definir objetivos de confidencialidad, integridad, disponibilidad y autenticidad.
  3. Elegir protocolos y bibliotecas establecidas, no construcciones improvisadas.
  4. Aplicar autenticación, autorización, validación y mínimo privilegio.
  5. Proteger secretos, usar aleatoriedad adecuada y registrar eventos relevantes.
  6. Probar, monitorear, actualizar y preparar respuesta ante incidentes.

La defensa en profundidad reconoce que ningún control es perfecto. Capas independientes reducen la probabilidad de que un único error se transforme en una brecha completa.

47.21 Errores frecuentes

  • Confundir codificación con cifrado o hash con autenticación.
  • Usar ejemplos criptográficos pequeños o código didáctico en producción.
  • Almacenar contraseñas con funciones rápidas genéricas o en texto plano.
  • Reutilizar nonces o material aleatorio sin seguir las reglas del protocolo.
  • Conceder permisos amplios por comodidad en lugar de aplicar mínimo privilegio.
  • Construir consultas, comandos o patrones a partir de texto externo sin controles adecuados.

47.22 Qué debes recordar y conclusión

  • La seguridad combina confidencialidad, integridad, autenticidad, autorización y disponibilidad.
  • La aritmética modular, los hashes, los grafos, la lógica y los autómatas aportan fundamentos distintos.
  • Hash, cifrado, MAC y firma digital tienen objetivos diferentes.
  • Las contraseñas requieren esquemas especializados con sal y costo.
  • Permisos y protocolos se benefician de modelos explícitos de relaciones y estados.
  • La criptografía segura depende de protocolos, implementaciones auditadas y operación responsable.

La matemática discreta permite razonar sobre las piezas que protegen un sistema; la ciberseguridad exige integrarlas correctamente. En el próximo tema aplicaremos los conceptos del curso en un proyecto integrador.