Saltar al contenido principal
riqo.ioHerramientas para grandes ideas

HMAC, checksum y verificación de integridad

Diferencias entre detección de errores accidentales, digest criptográficos y autenticación de mensajes con secreto compartido.

Concepto y contexto

Checksums, hashes criptográficas y HMAC pueden detectar cambios, pero responden a modelos de amenaza diferentes.

Un checksum busca corrupción accidental, una hash fuerte resiste mejor colisiones intencionadas y HMAC autentica datos entre partes con una clave secreta compartida.

Un buen modelo mental separa el concepto abstracto de su representación concreta y del entorno donde se utiliza. Esa separación evita trasladar automáticamente supuestos válidos en un protocolo, biblioteca o formato hacia sistemas que pueden aplicar reglas o garantías diferentes.

Fundamentos y terminología

CRC está pensado para errores de transmisión y no para adversarios; SHA-256 produce un digest sin secreto; HMAC construye un código de autenticación a partir de hash y clave.

Integridad por sí sola no identifica al productor si cualquiera puede recalcular el digest público.

La terminología debe leerse junto con el estándar, versión o contrato que la define, porque palabras parecidas pueden describir propiedades distintas según la capa. Explicitar esas definiciones mejora interoperabilidad, documentación y capacidad para diagnosticar comportamientos inesperados.

Cómo funciona

El emisor calcula HMAC sobre una representación canónica de bytes y el receptor lo vuelve a calcular con la clave compartida.

Serialización exacta, gestión de la clave, algoritmo y comparación constant-time forman parte del protocolo.

En sistemas reales conviene seguir el recorrido de los datos entre capas e identificar qué transformaciones son reversibles, cuáles introducen restricciones y dónde puede perderse información. Así resulta más sencillo razonar sobre responsabilidades entre productores, consumidores, almacenamiento y transporte.

Ejemplo razonado

Un archivo distribuido con un SHA-256 obtenido de una fuente fiable permite detectar corrupción.

Una webhook firmada con HMAC puede autenticar su payload si secret, canonicalization y protección contra replay se gestionan de forma deliberada.

Un ejemplo razonado es reutilizable cuando muestra sus precondiciones e invariantes y no solo el resultado final. Cambiar un supuesto cada vez permite distinguir el comportamiento garantizado por un estándar de las decisiones particulares de una aplicación o implementación.

Errores y conceptos equivocados

Publicar hash y archivo por el mismo canal comprometido no aporta autenticidad y CRC es insuficiente frente a un atacante.

Firmar una representación y verificar otra, por ejemplo JSON reordenado, también falla aunque los datos parezcan semánticamente equivalentes.

Muchos fallos nacen de supuestos implícitos entre sistemas aparentemente compatibles que usan versiones, reglas de canonicalización o modelos de tipos diferentes. En interoperabilidad y seguridad conviene especificar y probar entradas anómalas en lugar de tratarlas como casos irrelevantes.

Buenas prácticas y criterios de elección

Usa checksum para errores accidentales, hash para fingerprint e integridad con referencia fiable, HMAC para autenticación con secreto compartido y firma digital cuando se necesita verificación pública.

Versiona el formato firmado e incluye timestamps o nonce cuando importen los replay.

Una práctica robusta combina estándares documentados, bibliotecas maduras, contratos explícitos y pruebas con casos límite representativos. La mejor elección no es siempre la más breve o popular: también cuentan portabilidad, legibilidad, rendimiento, seguridad, evolución y coste operativo.

Guías relacionadas

Funciones hash: digest, integridad y seguridad

Propiedades de hashes criptográficos, SHA, colisiones, HMAC, password hashing y diferencias frente al cifrado.

Encoding, hashing y cifrado: diferencias y casos de uso

Tres transformaciones que suelen confundirse: representación, digest unidireccional y protección criptográfica reversible con clave.