Ir al contenido principal

Funciones hash: el invento que protege tus contraseñas de los hackers y te permite minar criptomonedas.

La criptografía es casi tan antigua como la necesidad de ocultar la información escrita. Son muy diversas las técnicas que se han empleado desde siglos atrás para transformar un texto en claro en uno cifrado, ilegible para quien no lo pueda descifrar. Uno de los ejemplos clásicos y más sencillos es el cifrado César, utilizado por Julio César para comunicarse con sus tropas durante la guerra contra los galos. Este mecanismo de cifrado se basa en sustituir cada letra del mensaje por aquella que se encuentra desplazada n posiciones en el alfabeto.

Por ejemplo, si n = 2, la sustitución alfabética sería la siguiente:

Alfabeto en claro: ABCDEFGHIJKLMNÑOPQRSTUVWXYZ 

Alfabeto cifrado: CDEFGHIJKLMNÑOPQRSTUVWXYZAB

Y si cifrasemos la palabra HOLA con n = 2 obtendríamos el siguiente resultado: 

H -> J, O -> Q, L ->N, A -> C: JQNC

Lo que llamaríamos la clave de cifrado es, en este caso n = 2. Como es lógico, cualquiera que conozca la clave, podrá revertir el cifrado desplazando el alfabeto dos letras hacia la izquierda, obteniendo el texto en claro. No es necesario entrar en más detalles, lo realmente importante es que este cifrado es reversible, es decir, conociendo la clave, podemos obtener el texto en claro a partir del criptograma con la misma facilidad con la que se cifró. Sin embargo, esto no es así con las funciones hash.

Una función hash genera una cadena cifrada a partir de otra cadena de entrada pero tiene varias particularidades que la hacen idónea para algunas aplicaciones muy específicas.




- La cadena de salida de la función siempre es de la misma longitud. No importa lo largo o corto que sea el texto de entrada, la función lo digiere y genera una salida de longitud constante. 

- Las funciones hash son de sentido único. Podemos obtener un criptograma a partir de un texto en claro pero después, no es posible volver a obtener el texto en claro a partir del criptograma. En otras palabras, es, o debería ser, imposible conocer el texto original a partir del resultado hash. Esto sería así idealmente. Si fuera realmente imposible, las filtraciones másivas de contraseñas cuando hackean la base de datos de algún servicio web nunca serían un problema y, sin embargo, sí lo son.

- La función hash en sí no debe ser secreta. No debe ocultarse el algoritmo para calcular funciones hash, lo importante es que las cadenas digeridas por la función no puedan ser revertidas al texto en claro.

- El cálculo de la función hash debe ser de poca complejidad computacional. En otras pañabras, su cálculo debe ser sencillo para un computador.

- La función debe ser resistente a colisiones. Esto quiere decir que encontrar dos textos de entrada distintos que resulten en una misma salida de la función hash debe ser muy difícil. En términos prácticos, la función deberá comportarse como si cada cadena de salida fuera única y obtenida a partir de una sola entrada. Esto no es así en la vida real pero, con los algoritmos de hash modernos y más seguros, es muy improbable encontrar colisiones. Por ejemplo, la probabilidad de que dos valores de entrada distintos obtengan una misma salida utilizando el algoritmo sha-256 es de 4.3*10-60 .

- Alteraciones mínimas en textos de entrada producen funciones hash completamente distintas y sin la menor relación. Es decir, si tenemos dos textos de entrada que difieren en un único caracter, sus resultados hash no tendrán nada que ver y serán imposibles de relacionar.

Y, ¿dónde se utilizan las funciones hash?

Aunque para quienes las desconocen pasan completamente desapercibidas, las funciones hash tienen infinidad de aplicaciones en tecnologías que utilizamos a diario.

Se utilizan de manera general para almacenar contraseñas en bases de datos. Cuando nosotros establecemos una contraseña para acceder a nuestra cuenta de Twitter, esta debe almacenarse en la base de datos de Twitter para que, al iniciar sesión, el sistema de autenticación pueda validarla y comprobar que la contraseña que hemos introducido es la correcta. ¿Sería seguro almacenar las contraseñas en claro en las bases de datos? Pese a lo evidente que parece la respuesta a esta pregunta, han ocurrido filtraciones masivas como la de RockYou en 2009, donde quedaron expuestas las credenciales de 32 millones de usuarios, que estaban almacenadas en claro. Como consecuencia, la lista de contraseñas publicada es a día de hoy una de las más utilizadas en ataques por diccionario y viene por defecto en Kali Linux. Por tanto, es esencial que todas las bases de datos almacenen las contraseñas cifradas y para eso se utilizan las funciones hash. Es posible que hackers logren filtrar el contenido de la base de datos pero no podrán hacer nada con los hashes de las contraseñas salvo tratar de revertirlos. Cosa que es posible mediante ataques de fuerza bruta o de diccionario. Por eso es tan importante emplear contraseñas seguras con suficientes caracteres y poco predecibles, que no puedan aparecer listadas en diccionarios como el de RockYou. Si tú contraseña es password1234, ten por seguro que la romperán sin ningún problema en caso de hacerse con su hash.

Otro uso interesante de las funciones hash se encuentra en la verificación de integridad de un archivo. Si tenemos un archivo crítico sobre el que tenemos que estar seguros de que no ha sido corrompido, la mejor forma de darnos cuenta en caso de ser modificado es mediante funciones hash. Es tan sencillo como coger el archivo en su estado original, obtener su función hash y almacenarla en un lugar seguro. Si dentro de un año queremos comprobar que el archivo no ha sido alterado, volvemos a calcular su hash y lo comparamos con el que guardamos originalmente. Si los dos hashes son distintos, podemos estar seguros de que el fichero ha sido alterado.

Podría mencionar una lista muy extensa de aplicaciones pero, para que este texto no se haga interminable, mencionaré por último el blockchain. Las funciones hash son el fundamento que hay detrás de la minería de criptomonedas.


Podríamos dedicar una entrada entera a explicar cómo funciona el blockchain pero, por ahora, me limitaré a hablar de que el mecanismo de Proof Of Work en el que se basa la minería de criptomonedas se fundamenta en el cálculo de funciones hash. Cuando un minero intenta cerrar un bloque de la red blockchain para ser recompensado como una criptomoneda, lo que hace es ir realizando modificaciones a un valor numérico añadido a la información que conforma dicho bloque para tratar de lograr que el resultado de aplicarle una función hash comience por una secuencia de ceros de una longitud determinada. Es decir, al minar criptos, lo que estamos haciendo realmente es un número elevadísimo de cálculos hash para encontrar ese número que, al añadirselo a la información y hacer el hash de todo ello, resulta en un hash de este estilo:

0000000000000000xawu876scdf76sd8fs7df6d87s6fsd87dsf9d8f7ds98 (tecleado de forma inexacta).

En definitiva, como no es posible revertir una función hash para averiguar con qué texto de entrada se obtiene, lo que estamos haciendo es una búsqueda a ciegas para tratar de encontrar dicho valor de entrada mediante prueba y error y eso tiene un coste computacional muy alto.

Espero que esta publicación haya aportado algo interesante y os invite a averiguar más. Nos vemos en la próxima.

Saludos.

Comentarios

Entradas populares de este blog

AMD Ryzen 4000 a principios de 2020.

Hace menos de una semana que la directora ejecutiva de AMD, Lisa Su, ha comunicado que la cuarta generación de los procesadores Ryzen llegará a principios de 2020. Concretamente, los primeros en llegar serán para portátiles y posteriormente para equipos de sobremesa. De este modo, AMD estrenaría la arquitectura Zen3 de 7nm este próximo año. Eso sí, como hemos comentado antes, los primeros en llegar, en el mes de enero, serían para ordenadores portátiles con arquitectura Zen2 de 7nm, que según lo que se sabe se presentarán en el CES de Las Vegas. Los Ryzen 4000 para ordenadores de sobremensa, con la nueva arquitectura Zen3 de 7nm, llegarán posteriormente, según se especula, para mediados de año. Cabe destacar también que se espera que la nueva arquitectura Zen3 sea compatible con los sockets actuales de AMD por lo que debería ser soportada por la mayoría de las placas base actuales para Ryzen (socket AM4). Como es lógico, con la arquitectura Zen3 se esperan aumentos e...