29 nov. 2013

MD5: vulnerabilidades y evoluciones

Ahora que Microsoft y Google (e incluso Twitter) se han embarcado en una especie de carrera criptográfica para potenciar los algoritmos de cifrado, firma, hash y clave pública, es un buen momento para repasar y entender por qué algunos de estos algoritmos dejan de ser útiles y qué alternativas se manejan. El ejemplo más claro de algoritmo obsoleto (pero aún usado) es MD5.

Hash codes
Los hashes (hash codes) son los resultados de mapear unos determinados valores de entrada a un código de tamaño fijo. Las funciones hash se encargan de llevar a cabo este proceso. Su uso en criptografía dio lugar a la aparición del grupo de algoritmos criptográficos denominados algoritmos de resumen o hash, donde los hash codes resultantes se definirán como resúmenes. Las tres propiedades más importantes que debe presentar una función hash o en su defecto, un algoritmo de resumen, son:
  • Resistencia a la colisión. Las colisiones son el problema inherente a establecer una relación entre un conjunto infinito de entrada (cualquier flujo de bytes) y un conjunto finito (el número de combinaciones que ofrezca la longitud del hash). Esta resistencia se definirá como la dificultad para encontrar dos entradas que den como salida un mismo hash code.
  • Resistencia a la preimagen o dificultad presentada para deducir la entrada a partir de la función hash y el hash code. Este problema es el que tienen por ejemplo, las bases de datos que almacenan el hash MD5 de las contraseñas. Actualmente es relativamente sencillo deducir el texto claro a partir del hash, gracias en parte a los precáculos realizados con las rainbow tables.
  • Resistencia a la segunda preimagen o dificultad para que, dado una entrada fija, sea posible encontrar otra que tenga un mismo hash code resultante.


La gran mayoría de funciones hash que han sido utilizadas en la práctica para la criptografía, pertenecían a la familia MD (Message-Digest Algorithm). Inspiradas en ellas, o en sus debilidades, han surgido algunas de las funciones hash modernas, entre las que destacan la familia SHA (Secure Hash Algorithm) y RIPEMD (RACE Integrity Primitives Evaluation Message Digest). Existen algunas otras funciones, como Whirlpool, que comienzan a surgir en la actualidad, aunque su tasa de uso aún es muy baja. Daremos un repaso a sus principales características.

MD family
Esta colección de funciones fue originalmente desarrollada por Ron Rivest (MIT) para RSA Security. La primera propuesta fue MD2, un novedoso diseño orientado a byte. Esta fue rápidamente seguida por MD4 y MD5, dos funciones hash más modernas con un diseño de 32 bits. A pesar de tratarse de algoritmos que irrevocablemente están condenados a la aparición de colisiones, MD4 inspiró la mayoría de los diseños de funciones hash posteriores como los ya citados SHA y RIPEMD.

SHA family
La familia SHA es un sistema de funciones hash criptográficas relacionadas con la Agencia de Seguridad Nacional de los Estados Unidos y publicadas por el National Institute of Standards and Technology (NIST). Presenta una metodología de operación muy similar a la de MD5, aunque con la variación de ofrecer un resumen de 160 bits, lo que lo hace más robusto. El primero en salir fue SHA (posteriormente renombrado SHA-0 para evitar confusiones). Dos años más tarde el primer sucesor de SHA fue publicado con el nombre de SHA-1. Hoy en día existen cuatro variantes más publicadas bajo el nombre de SHA-2, cuyas diferencias se basan en un diseño algo modificado y rangos de salida incrementados: SHA-224, SHA-256, SHA-384, y SHA-512. En la actualidad empieza a dibujarse el SHA-3 elegido como tal en octubre de 2013.

RIPEMD family
Fueron desarrollados por el grupo de investigación COSIC en Bélgica. El primer algoritmo de RIPEMD nació basado en los principios de diseño de MD4. Debido a los fallos de seguridad detectados, apareció la versión RIPEMD‑160, con 160 bits de resumen, similar en seguridad a SHA-1. Con RIPEMD‑160 también surgieron RIPEMD‑256 y RIPEMD‑320, entre otros. Si bien sus niveles de seguridad son igual de altos, el incremento en el número de bits del resumen reduce las posibilidades de colisión aleatoria.

Un repaso a MD5 (Message Digest Algorithm 5)
El algoritmo fue propuesto como reemplazo a MD4 después de que Hans Dobbertin presentase formalmente sus vulnerabilidades en 1994. También fue de los primeros en alertar, en 1996, de que MD5 debía ser reemplazado. El diseño de MD5 se llevó a cabo orientado a máquinas de 32 bits. Sin embargo, su funcionamiento, más seguro que su predecesor, conllevaba un proceso más lento. Atendiendo al artículo publicado por Rivest, el funcionamiento de MD5 se resume en 4 pasos, a saber:
  • Adición o padding de bits hasta alcanzar los tamaños deseados. Más concretamente, se añade un 1 y una cadena de ceros hasta ser congruente con 448 módulo 512.
  • Sobre el mensaje "padeado" se añade una variable de 64 bits (448+64=512) que completará el último bloque y que contendrá la información de la longitud del mensaje pre-padding.
  • Inicializar el búfer MD donde se llevará a cabo la computación del hash del mensaje. Cada búfer será un registro de 32 bits inicializados como sigue:
  • Procesado del mensaje en bloques de 16 palabras. Tomando de entrada estas palabras de 32 bits, se definen cuatro funciones auxiliares:

Mediante un proceso iterativo que utiliza adicionalmente una tabla de 64 valores construida a partir de la función seno detallado en el artículo de Rivest, se producen cuatro palabras de salida de 32 bits que compondrán el resumen (4x32=128 bits). El efecto final sobre el mensaje será un procesado de una longitud arbitraria del mensaje en bloques de 512 bits generando un resumen de 128 bits.

Continuar leyendo la segunda parte de MD5: vulnerabilidades y evoluciones

Fuente: Eleven Paths

0 comentarios:

Publicar un comentario

Gracias por dejar un comentario en Segu-Info
Si vas a dejar una consulta, procura tener habilitado tu perfil en Blogger o deja una forma de contacto.

Gracias por comentar!