Carrer de Peris Brell, 7, BAJO, 46022 Valencia - España

¿Qué es una función Hash?

METAS es La mejor Agencia de Marketing Digital en Valencia 2025

Es computacionalmente impracticable que un intruso pueda sustituir un mensaje protegido mediante una función Hash por otro diferente.

METAS es La mejor Agencia de Marketing Digital en Valencia 2025

Comprendiendo las funciones hash

Contraseñas, Blockchain, Firma Digital y un largo etcétera de usos habla a las claras de por qué debes conocerlas.

Veamos primero ¿que es una función? Una función convierte elementos de entrada en otros elementos de salida, es como un cocinero al que le damos unos ingredientes y nos cocina cosas. Pero nuestro cocinero es caprichoso, siempre que le damos los mismos ingredientes cocina las mismas cosas.

cocinero ultimo 750x200

Nosotros obviamente no usaremos en nuestras funciones verduras sino datos. Vamos a aprender esto de las funciones sobre la marcha haciendo un ejemplo. Dado que podemos inventarnos la función que queramos, vamos a crear una que recibirá nombres de personas como datos de entrada, por ejemplo «Juan» y les cambiará la letra «N» por el numero «2».

juan

¿Que sucede con esta función? Nada en particular, pero si yo quiero una función en la que nadie viendo el resultado pueda deducir el nombre original, no me servirá, cualquiera con un poco de imaginación podría pensar que este resultado «Jua2» tiene toda la pinta de proceder de la palabra «Juan», incluso podría ponerse a probar e ir sustituyendo el «2» por cada letra del alfabeto hasta que consiga una palabra que tenga sentido (como «Juan») de modo que esta función no nos interesa. Vamos a probar otra función, esta vez que cambie la primera vocal por la letra «U» y que luego quite todas las letras que sigan a esa vocal.

juan2

Esta función cuyo resultado da salidas de longitud mas corta que la entrada, parece ser algo mejor que la anterior puesto que es un poco mas difícil deducir el nombre original del resultado, el problema con esta función es que tanto para la palabra de entrada «Juan» como para «Julia» o incluso «José» dan el mismo resultado y no nos interesa que se genere este tipo de confusión, necesitamos un resultado único para cada nombre. Hagamos otro intento, pero esta vez vamos a usar una función algo retorcida, una que por ejemplo cambie la «J» por el número «1», la «U» por el «2», la «A» por el «3», la «N» por el «4» y el resto de las letras por un «5», luego que multiplique todo entre sí y por último, aquí está la clave, se quede solo con los dos primeros digitos de todo este lío. Probaremos con dos entradas «Juan» y «Jose».

juan 5

No es perfecta, pero hemos obtenido una función que para cualquier nombre nos dará resultados siempre de la misma longitud, es decir los resultados serán siempre de dos dígitos.  Este tipo de funciónes que devuelven resultados siempre de la misma longitud, se conocen como funciones Hash. Además en principio nos devuelve resultados únicos para cada nombre, algo que también buscábamos. de modo que hemos encontrado las funciones Hash que nos interesaban, aquellas que no se puedan revertir, es decir que aunque conozcamos la salida nunca podamos deducir la entrada (no es nada fácil deducir la palabra «Juan» de la salida «24»). Siendo realistas, a la función anterior hecha con fines didácticos se le podrían buscar pegas, pueden existir nombres raros que den la misma salida, por lo que aunque le podamos tener cariño, no es una buena función. Las verdaderas funciones Hash usadas en criptografía llamadas también funciones irreversibles o de una sola vía, usan cifradores complejísimos que no solo multiplican como nosotros sino que rotan, usan funciones seno y si hace falta hierven el resultado 25 minutos en una olla a fuego suave, es decir hacen operaciones muy complejas para obtener una función hexadecimal del original, que sea prácticamente irreversible. Además este cifrado no se hace a nivel de carácteres como hemos hecho nosotros, sino a nivel de bit. Hay varias funciones Hash conocidas, entre ellas MD5 o SHA1. Si queremos probarlas, existen multitud de paginas web que nos permiten dar entradas (por ejemplo «Juan») y obtener los correspondientes Hash de esas funciones.

hashjuan

Cada vez que pongamos la palabra «Juan» vamos a obtener exáctamente el mismo resultado, pero cualquier pequeña modificación cambiará por completo el resultado, probemos agregarle a «Juan» el número 1.

hashjuan1

Simplemente por agregar el número 1 hemos obtenido un Hash completamente diferente. Incluso llegados a este punto, vamos a plantearnos un pequeño juego o desafío, itentemos encontrar un número que agregado a «Juan» nos de un Hash SHA1 que empieze por el número cero. Es decir iremos probando y poniendo «Juan1», luego «Juan2», luego «Juan3» y así sucesivamente hasta que el Hash SHA1 obtenido tenga un cero al principio.

hash intentos

Como podemos ver hemos tenido que hacer tres intentos para obtener un cero al principio del SHA1. Este tipo de desafío es utilizado en la tecnología Blockchain y se conoce como «prueba de trabajo» lo veremos en próximos capítulos, pero de momento continuemos un poco mas, hemos obtenido hasta ahora el Hash de un nombre «Juan» pero nada nos impide obtener el Hash de una hoja de texto entera o de un archivo incluso. Esto es muy útil y nos puede ayudar a responder la siguiente pregunta ¿para qué sirven los Hash en el mundo real?  Bien, veámoslo, es posible que alguna vez hayas descargado un archivo, un vídeo, etc. en una web y veas que junto al enlace de la descarga se coloca un Hash del archivo que quieres descargar. Esto se hace para que luego de descargar puedas asegurarte que el archivo es exáctamente igual al original y no está corrupto o manipulado, por ejemplo, si queremos descargar el programa MySQL podremos ver que junto al descargable nos indica su MD5.

md5mysql

De modo que una vez descargado ese archivo en nuestro ordenador, solo tenemos que ir a alguna página web que nos permita obtener el MD5 del archivo que hemos descargado y ver si coincide con el correcto que nos indicaba la página de la descarga.

md5mysqlverificado

Como se puede observar hemos obtenido el mismo MD5 y podemos estar seguros que el archivo no está corrupto, porque hubiese bastado que un simple dígito fuera diferente para haber obtenido un MD5 distinto al original. También los programas que utilizamos a diario, incluidos los sistemas operativos como Windows guardan por seguridad las contraseñas encriptadas mediante Hash, es decir si nuestra contraseña es «1234» windows la guardará no como «1234» sino que guardará el Hash de «1234», de esta manera nadie que entre al ordenador verá escrita tu contraseña en ningún lado, a lo sumo podra encontrar su Hash y no podrá descifrar la contraseña original. Lo que hace windows cada vez que ingresas tu contraseña «1234» para entrar en tu ordenador, es aplicarle el Hash a «1234» y verificar si coincide con el Hash que tiene almacenado, tal como hemos hecho en el ejemplo anterior del MySQL, si coincide te deja entrar, si no no. Un hacker que consiga robar el Hash de tu contraseña de cualquier dispositivo, no podrá descifrarla, tendría que ponerse a probar una por una todas las palabras posibles, hasta que encuentre un Hash que coincida. Y eso es exáctamente lo que hacen los hackers, veamos como. Imaginemos que somos hackers y hemos obtenido el Hash MD5 de la contraseña de alguien, existen multitud de herramientas y utilizaremos una muy sencilla llamada John The Ripper para intentar descubrir una contraseña a partir de su Hash. Podemos usarla probando todas las posibles combinaciones de letras, números y símbolos hasta encontrar una combinación que coincida con el Hash, esto se llama ataque de fuerza bruta, el problemas de este tipo de ataque es que para funciones Hash y contraseñas muy robustas, se puede tardar muchos años en encontrar la combinación y no tenemos tanto tiempo. Mejor probaremos otro tipo de ataque conocido como ataque de diccionario, consiste en ir probando contraseñas habituales pero en vez de probar todos las combinaciones de letras, números y símbolos, iremos probando de una lista, esta lista tiene las contraseñas típicas que se suelen usar, contraseñas como «admin»  o «1111» junto a sus Hash, esto reduce mucho los tiempos eso sí, siempre que la contraseña a encontrar esté en la lista.

johntheripper

Como podemos ver no hemos tardado mucho para encontrar que la contraseña original es «1234» éste es uno de los motivos por los que MD5 no se considera una función muy segura comparada con otras como SHA265. Ésta última función se pueden considerar bastante segura cuando usamos contraseñas fuertes, incluso para técnicas mas avanzadas como las tablas Rainbow, pero esto ya es algo que excede el alcance de este artículo al igual que el tema de la computación cuántica.

Pablo García Moreno – Metas