HMAC
HMAC es un código de autenticación de mensaje construido a partir de una función hash y una clave secreta compartida, especificado en el RFC 2104. Demuestra que un mensaje no se alteró y que viene de alguien que tiene la clave, que es una garantía distinta de la de una firma digital: las dos partes pueden producirlo, así que establece autenticidad pero no no repudio.
La construcción calcula el hash del mensaje dos veces con la clave mezclada mediante dos constantes de relleno distintas, y eso es lo que la hace resistente a los ataques de extensión que permite una concatenación ingenua de clave y mensaje. Esa construcción implica además que su seguridad no se desploma en el momento en que se encuentran colisiones en el hash subyacente, y por eso un HMAC construido sobre funciones hash antiguas siguió siendo válido para autenticación después de que esos hashes se retirasen para firmas.
La distinción respecto de una firma digital es la que importa comercialmente. Con una clave compartida, cualquiera de las dos partes pudo haber producido el valor, así que no sirve para demostrar ante un tercero quién envió algo. Cuando hay que resolver una disputa, lo que hace falta es una firma con clave privada, no esto.
En trabajo de API se repiten tres hallazgos. La verificación hecha con una comparación de cadenas corriente, que termina en el primer byte distinto y filtra el valor correcto por el tiempo de respuesta. Firmas calculadas solo sobre una parte de la petición, de modo que un atacante puede alterar una cabecera no firmada, el método o un parámetro de la consulta y mantener el valor válido. Y un JWT simétrico firmado con un secreto compartido corto que es una contraseña en vez de una clave aleatoria, que se rompe offline en cuanto se captura un solo token. Los tres son comprobaciones habituales en el pentesting de API donde se examinan la firma de peticiones y la verificación de tokens.