¿Cómo funciona un HMAC y por qué usarlo en lugar de un hash simple?
Respuesta breve
Un HMAC es un código de autenticación de mensajes con clave: aplica un hash al mensaje junto con una clave secreta mediante una construcción anidada (hash interno y externo con rellenos derivados de la clave). Prueba tanto la integridad (el mensaje no fue alterado) como la autenticidad (proviene de alguien que posee la clave). Un hash simple no prueba ninguna de las dos, ya que cualquiera puede recalcularlo; HMAC además resiste ataques de extensión de longitud.
Esta pregunta comprueba si entiendes la diferencia entre integridad (los datos no cambiaron) y autenticidad (los datos provienen de una parte concreta), y por qué un hash desnudo no te da ninguna de las dos en un entorno adversarial.
Por qué un hash simple no basta
Si envías un mensaje más SHA-256(mensaje), un atacante que modifique el mensaje puede simplemente recalcular el hash. No hay ningún secreto involucrado, así que el resumen no prueba nada sobre quién lo produjo. Podrías pensar que SHA-256(secreto || mensaje) lo soluciona, pero es vulnerable a un ataque de extensión de longitud: con hashes como SHA-256 y SHA-1, conocer el resumen de secreto || mensaje permite a un atacante calcular un resumen válido para secreto || mensaje || extra sin conocer el secreto. Eso rompe la seguridad que buscabas.
Cómo se construye HMAC
HMAC resuelve esto con una construcción anidada específica. Deriva dos claves rellenadas a partir del secreto (un relleno interno y uno externo) y calcula:
HMAC = H( (clave ⊕ opad) || H( (clave ⊕ ipad) || mensaje ) )
El mensaje se hashea bajo la clave, y ese resultado se vuelve a hashear bajo la clave. Este doble envoltorio es lo que derrota la extensión de longitud y vincula el resumen al secreto. Cualquiera que posea la clave puede verificar la etiqueta; quien no la tenga no puede falsificar ninguna.
Qué te aporta
Un HMAC válido le dice al receptor dos cosas a la vez: el mensaje no fue modificado y fue producido por alguien que conoce la clave compartida. No proporciona confidencialidad: el mensaje en sí sigue siendo legible salvo que se cifre por separado, por lo que existen los modos de cifrado autenticado.
Una trampa de implementación
Comparar la etiqueta recibida con la calculada debe hacerse en tiempo constante. Una comparación ingenua byte a byte que retorna antes de tiempo filtra información temporal que un atacante puede usar para falsificar una etiqueta.
Qué buscan los entrevistadores
Menciona la clave secreta, la garantía de integridad-más-autenticidad, la resistencia a la extensión de longitud como razón del diseño anidado, y el detalle de la comparación en tiempo constante para puntos extra.
Posibles preguntas de seguimiento
- ¿Por qué añadir un secreto a un mensaje (hash(secreto || mensaje)) no funciona de forma segura?
- ¿Qué es un ataque de extensión de longitud y qué hashes son vulnerables?
- ¿Por qué la verificación de un HMAC debe usar una comparación en tiempo constante?