Esta vez trataremos dos conocidas técnicas usadas para utilizar un problema común en criptografía: la autenticación. De forma sencilla, la autenticación es el proceso de establecer una identidad o el origen de un mensaje.
Para conseguirlo usando criptografía simétrica, existen dos mecanismos básicos. El primero de ellos, conocido como
Códigos de Autenticación de Mensajes (MAC, Message Authentication Codes) se basa en usar un cifrado de bloques y una clave compartida entre la parte que quiere probar su identidad (o asegurar un mensaje) y la parte que desea verificar dicha identidad o el origen de dicho mensaje.
La segunda, conocida como
Hashed Message Authentication Codes (HMAC) se basa en el uso de una función de hash junto a una clave compartida. En el resto de este post describo brevemente la idea básica detrás de estas dos técnicas para asegurar la autenticación de mensajes.
Message Authentication Codes usando cifrados de bloque
Una forma común de autenticar mensajes es utilizar un cifrado de bloques, como DES, en un modo de operación que haga que el último bloque cifrado dependa tanto de la clave como de todos los bloques de mensaje anteriores. Por ejemplo, podemos pensar en utilizar 3DES en modo CBC para crear un MAC sobre un mensaje: ciframos el mensaje en modo CBC usando 3DES con una clave compartida, tomamos el último bloque de salida y lo añadimos a nuestro mensaje original.
Cuando el receptor obtiene el mensaje con su MAC asociado, realiza la misma operación: cifrar cada bloque usando el modo CBC y tomar el último bloque. Este resultado es comparado con el código añadido al mensaje: si coinciden, el emisor del mensaje debe conocer la clave (a no ser que el cifrado usado haya sido roto…).
A pesar de ser una de las técnicas más populares para la generación de MACs (si no la más popular), CBC-MAC tiene algunos problemas y se han desarollado otras técnicas. Por ejemplo, puedes echar un ojo a la
Special Publication 800-38B del
NIST.
Hashed Message Authentication Codes
HMAC es una forma estándar de usar
funciones hash para autenticación. La idea es incorporar el uso de una clave en la función de hash, de forma que el resultado no pueda ser obtenido sin saber la clave.
Las implementaciones obvias consistentes en prefijar el mensaje con la clave o en añadir la clave detrás del mensaje antes de realizar el cálculo del hash tienen problemas de seguridad (ver
Stop using unsafe keyed hashes, use HMAC de Nate Lawson). Por tanto, se inventó una estructura ligeramente más compleja para evitarlos.
La construcción HMAC se define como:
Donde opad (outer pad) es la constante 0×5c…5c e ipad (inner pad) es la constante 0×36…36. Estas constantes, al igual que la clave, son del mismo tamaño que el tamaño de bloque de la función hash.
Con esto procederíamos de la misma forma que con cualquier MAC: obtendríamos el HMAC para un mensaje dado y lo mandaríamos junto al mensaje. El receptor realizaría el mismo cálculo y si su HMAC coincide con el recibido con el mensaje concluiría que el mensaje fue enviado por alguien que conoce K (con suerte la única persona/entidad con la que compartí dicha clave

).
Esto concluye mi introducción a los códigos de autenticación. Si buscas un buen análisis de seguridad de funciones HMAC, espera al post de Nate Lawson al respecto que seguro que merece la pena.
Fuente