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.
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 323 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.
Veremos en la siguiente entrega sus debilidades y qué alternativas se han propuesto.
Julia Llanos