El algoritmo MD5

¿Qué es MD5?

MD5 es un algoritmo que toma como entrada una cadena de cualquier longitud y genera un message digest o fingerprint a partir de ella. Ese fingerprint es una cadena arbitraria de 32 caracteres en notación hexadecimal (realmente se trata de una cadena de 128 bits).

Ejemplos de MD5:

Mensaje / fingerprint

hola / 4d186321c1a7f0f354b297e8914ab240
La casa de la pradera en lo alto del río /     92346a0999803dd9d63184e9c4749e11
La casa de la pradera en lo alto de la ría /     cfb04578d958bac2288ca2cdecaf13c5

Para qué sirve el MD5

Se diseñó para comprobar la integridad de los datos en transmisiones de cualquier tipo.

La entrada del algoritmo puede ser (y de hecho es común que sea) un archivo completo. Por ejemplo, el hash del contenido de este documento es "7f1ac9a83858a8d812437ab87a30e98c".

Es frecuente al descargar archivos de una web (especialmente archivos grandes) encontrar el hash o fingerprint MD5 de los mismos. Una vez descargado, aplicas el algoritmo MD5 sobre el archivo de tu PC, y si el hash resultante coincide con el hash del fichero original significa que ambos son idénticos (con una probabilidad de error infinitesimal).

Nos aseguramos de así que los datos no son manipulados durante su transmisión, o de que no se ha producido ningún error durante la misma.

Características del fingerprint

Como se aprecia en los hashes anteriores, el fingerprint resultante tiene una longitud fija, independiente del tamaño del mensaje de entrada.

El hash MD5 es constante para cada cadena. Es decir: el hash de "hola" es SIEMPRE "4d186321c1a7f0f354b297e8914ab240". Hoy, el año que viene, estemos en China, España o Madagascar.

Vemos también como, a pesar de lo similares que son los dos últimos mensajes, sus fingerprints son radicalmente distintos. Esto es una característica muy importante del algoritmo MD5 puesto que, errores o variaciones muy pequeñas en la entrada provocan enormes diferencias en la salida.

Cuando se producen errores en la transmisión, un solo bit erróneo dentro de un archivo de muchos megabytes puede ser fatal. En caso de existir esa pequeña variación entre el archivo original y el recibido, nos daremos cuenta por lo diferente de su hash MD5.

Detengámonos a pensar unos instantes sobre esta afirmación: Hay infinitas cadenas con el mismo hash MD5

Te estarás preguntando:

"¿Cómo es esto posible? ¿No es tan seguro y eficaz el algoritmo?"

En efecto, lo es. Pero date cuenta de que los posibles diferentes hashes son limitados. Muchísimos, pero finitos (3216 exactamente: más de 1.2x1024).

En contraposición, las cadenas o mensajes que existen son infinitos. Podemos hallar el hash MD5 de la Biblia, de la Enciclopedia Larousse... de la Biblia añadiendo una "Ñ" al final del Apocalipsis... Y sí, los hashes resultantes serán muy distintos, cuasi-aleatorios... pero tras miles de pruebas encontraremos hashes coincidentes para diferentes entradas.

El algoritmo MD5 estima que hallar dos hashes iguales para diferentes cadenas supone una dificultad de 264 intentos (tendríamos que hallar 1.84467440737E+19 hashes diferentes para encontrarnos con uno de estos).

¿Se puede desencriptar un hash MD5?

La respuesta es muy sencilla: NO

Básicamente porque MD5 no es un algoritmo de encriptación (codificación para los amantes de la lengua) sino para hallar un message digest.

En dicho message digest no existe información alguna de la cadena original. Es una simple huella digital del mensaje, pero su contenido no se encuentra implícito en los 32 caracteres que componen el hash.

Para que se entienda mejor, lo explicaré con un ejemplo:

Los hashes MD5 son comparables a las huellas dactilares del ser humano. Supongamos que un CSI encuentra la huella dactilar del asesino de turno: Mediante la simple observación de esa huella no obtendrá ninguna información. En la huella en sí no hay información sobre si el asesino es hombre, mujer, rubio o moreno, alto o bajo. No sería capaz de decirnos nada aparte de "es una huella".

Solamente mediante la comparación de dicha huella con la base de datos de la policía, y hallando una coincidencia con las allí almacenadas, podremos descubrir la identidad del asesino.

Afirmarás:

"Un hacker seguro que puede desencriptar hashes MD5"

No. Ni siquiera Ronald L. Rivest, el programador del algoritmo es capaz de desencriptar un hash MD5. Cualquier programa o utilidad de hacking que te encuentres que afirme que es capaz de hacerlo miente, o no sabe de lo que está hablando (que es más probable).

De donde no hay no se puede sacar, y si el hash no contiene información de la cadena de entrada, no nos la podemos inventar.

Ten en cuenta que si fuésemos capaces de desencriptar hashes MD5, habríamos inventado el algoritmo de compresión más potente del mundo.

Imagina que hallamos el hash de la trilogía de "El Señor de los Anillos": una cadena enorme, decenas de megabytes. Imagina que el hash resultante es por ejemplo: 4cf78a309d67c6ed32a29fc722ab7d9 (con 32 caracteres, como todos). Si eres capaz de desencriptar esa cadena y obtener de ella la trilogía completa enhorabuena, nunca más usaremos winzip xD.

El algoritmo MD5 estima que, dado un hash cualquiera, la dificultad de encontrarse con el mensaje que lo produjo es de 2128 intentos (3.40282366921E+38, tarea computacionalmente imposible).

MD5 para almacenar passwords

En este apartado no hay contradicción alguna con todo lo dicho anteriormente. MD5 no es lo más seguro para almacenar las passwords de nuestros usuarios en una base de datos. De hecho, cualquier persona con acceso a dichos hashes podría hallar el 80% de las claves en menos de 15 minutos cada una. El problema radica en lo de siempre: no usar las cosas para lo que han sido diseñadas.

Preguntarás:

"¿Y como lo hacen? ¿No decías que un hash MD5 no se puede desencriptar?"

En efecto, no se puede. Cuando un usuario mete su password en una web que usa este sistema, el script halla su hash y lo compara con el guardado en la base de datos. Si coinciden es que la password es la misma (este proceso sigue la filosofía de la verificación de la integridad de datos).

Pero aquí tenemos una ventaja primordial: sabemos que la longitud de las passwords es limitada y casi nunca supera los 10 caracteres.

Podemos proceder pues a realizar un ataque por fuerza bruta. Es decir, hallar el hash de todas las combinaciones de letras y números hasta un máximo de 8 o 10 caracteres e ir comparando cada resultado con el hash guardado en la db. Cuando hallemos coincidencia, habremos encontrado la password.

Este proceso suele ser largo, varias horas. Si nos encontráramos ante un hash de un archivo real nos resultaria imposible, puesto que hacer un ataque de fuerza bruta con cadenas de mas de 10 caracteres es una locura. Un ataque con fuerza bruta con cadenas de 1 megabyte nos llevaría varios siglos.

Otros ataques más sofisticados no prueban todas las combinaciones, sino que hallan los hashes de palabras de menos de 10 u 8 caracteres a partir de un diccionario (y probando varias combinaciones numéricas con cada palabra). En este proceso, y dado que las passwords de los usuarios suelen ser lamentablemente fáciles de crackear no tardaríamos más de 15 minutos con gran parte de las contraseñas.

Bien es cierto que el atacante tendría que tener acceso a los hashes de la base de datos para realizar estos ataques, aún así la moraleja es clara: Usa las cosas para lo que han sido pensadas.

EOF

El algoritmo MD5 thessoro © 2004 Todos los derechos reservados

Resumen

Introducción a MD5, uno de los algoritmos de hash más utilizados actualmente. Descubre su función y qué aplicaciones tiene.

Índice

  1. El algoritmo MD5

Otros artículos