¿Qué son los hashes y las funciones hash?
En el post de hoy voy a intentar explicar de una manera fácil de entender qué es una función hash y qué es un hash, de modo que todo el mundo pueda tener los conceptos claros para las pasadas entradas del blog y para las venideras.
El termino hash proviene del significado del verbo en ingles chop o de la frase en ingles make a mess, ya que las funciones hash se encargan de cortar y mezclar una entrada para obtener una salida. La persona que acuño este término fue H. Luhn de IBM en el año 1953.
Las funciones hash, son funciones unidireccionales, es decir dado una entrada se obtiene una salida, pero no es posible obtener la entrada a partir de la salida. A partir de un mensaje m de tamaño variable, se consigue una representación de tamaño fijo del propio mensaje del tipo h(m) el cual se conoce como resumen o hash.
Pero claro no todo en este mundo es perfecto, es por eso por
lo que, las funciones unidireccionales serán funciones hash si cumplen que para
cualquier resumen o hash es muy difícil, pero no imposible encontrar un mensaje m que produzca el mismo resumen. Por lo tanto, una buena función hash es aquella
que tiene pocas colisiones para un conjunto de entradas.
Para que una función hash se considere segura y por lo tanto
sea una función hash criptográfica, debe
de cumplir las siguientes características:
- Unidireccionalidad: Conocido un resumen o hash, del tipo h(m), debe de ser computacionalmente imposible encontrar m a partir de h(m).
- Comprensión: A partir de un mensaje de cualquier longitud, el resumen h(m) debe tener una longitud fija. Lo normal es que la longitud del resumen h(m) sea menor que m.
- Facilidad de cálculo o bajo coste: Debe de ser fácil calcular h(m) a partir de un mensaje m.
- Difusión: El resumen h(m) debe de ser una función compleja de todos los bits que conforman el mensaje m. Si se modifica un bit del mensaje m, el hash debería cambiar aproximadamente la mitad de sus bits.
- Colisión simple: Conociendo m será computacionalmente imposible encontrar mensaje m’ tal que h(m) = h(m’). Esto se conoce como resistencia débil a las colisiones.
- Colisión fuerte: Será computacionalmente difícil encontrar un par de mensajes m y m’ de forma que h(m) = h(m’). Esto se conoce como resistencia fuerte a las colisiones.
- Imagen: El conjunto de posibles valores de salida debe ser finito y bien definido.
Las funciones se encadenan de forma iterativa, partiendo el mensaje de entrada y enlazándolos en las siguientes iteraciones de la función, de manera que la salida de una iteración sea la entrada de la siguiente, podemos verlo como que la entrada en el paso x sea función del x-esimo bloque del mensaje y de la salida del paso x-1.
Es muy frecuente incluir en alguno de los bloques del
mensaje m (al principio o al final) información sobre la longitud total del
mensaje.
Las funciones hash se suelen utilizar para los siguientes
escenarios:
- Firma digital: En lugar de firmar digitalmente el mensaje completo, se firma digitalmente un resumen o hash de dicho mensaje, representado por pocos bits ya que es más rápido.
- Integridad: se utilizan para verificar la integridad de los mensajes, ya que, si se produce un cambio, el resumen o hash que se genera también es diferente.
- Gestión de contraseñas: A la hora de almacenar contraseñas es más seguro si en lugar de almacenar la contraseña almacenamos su resumen o hash.
- Derivación de claves: se utilizan funciones hash especiales, las cueles presentan resistencia a ataques realizados mediante GPUs. Estas funciones son más lentas para poder ralentizar los ataques mediante GPUs. Estás funciones son conocidas como PBKDF (Password-Based Key Derivation Function). Las funciones más utilizadas para este escenario son PBKDF2, BCRYPT, SCRYPT y ARGON2 (de estas funciones hablaremos en futuras entradas al blog).
- Detección de virus: pudiendo hacer una base de datos del hash de un virus.
- Detección de modificación de ficheros: utilizando las propiedades de un hash podemos saber si un fichero se ha modificado o no.
Los ataques más comunes para un hash son los ataques
mediante colisiones, mediante preimagen y el ataque del cumpleaños (que nombre más bonito para un ataque).
- Colisiones: Como hemos visto podemos definir una colisión como la situación en la que dos entradas diferentes en un algoritmo, producen la misma salida. Por lo que un ataque es encontrar dos mensajes que tengan el mismo resumen (colisión débil) o partiendo de un mensaje encontrar otro con el mismo resumen (colisión fuerte)
- Preimagen: Tiene que ser computacionalmente imposible que un atacante partiendo de un resumen o hash obtenga un mensaje para dicho resumen.
- Ataque de cumpleaños: ataque de fuerza bruta que busca colisiones probando todas las combinaciones posibles de 2 textos. Se basa en la paradoja del cumpleaños, que se puede resumir diciendo que la probabilidad de que dos o más personas en un grupo de individuos hayan nacido el mismo día, es superior al 50% cuando el número de personas es igual o mayor que 23 sujetos.
Debido a que en los algoritmos sencillos se han encontrado
colisiones e incluso ataques de preimagen, se recomienda utilizar algoritmos
más seguros como SHA-2 o SHA-3.
SHA-2 es un conjunto de funciones hash criptográficas (SHA-224,
SHA-256, SHA-384, SHA-512) diseñadas por la Agencia de Seguridad Nacional de los Estados Unidos (NSA)
y publicada en 2001 por el Instituto Nacional de Estándares y Tecnología (NIST)
como un Estándar Federal de Procesamiento de la Información (FIPS).
SHA256 fue diseñada especialmente para procesadores de 32
bits, mientras que SHA512 fue diseñada para procesadores de 64 bits. Ambas
versiones son consideradas seguras en el momento que estoy escribiendo estás palabras, también se recomienda utilizar SHA-3, que es el último estándar hasta la fecha.
En 2005, se identificaron fallos de seguridad en el SHA-1,
permitiendo que existiera una debilidad matemática y evidenciando así la
necesidad de elaborar una función hash más fuerte. Aunque el SHA-2 se comporta
de forma parecida al algoritmo SHA-1, estos ataques no han sido extendidos
satisfactoriamente a SHA-2.
La competición de funciones hash de la NIST seleccionó
una nueva función hash, el SHA-3, en 2012. A diferencia de SHA-2 con
SHA-1, el algoritmo SHA-3 no es derivación del SHA-2.
En futuras entradas al blog vermos con más detenimiento estás funciones hash, creo que por hay es suficiente :)
Como ha sido un post bastante teórico para lo normal en este blog y además no hay fotografías, me gustaría recomendar también este vídeo de la universidad politécnica de Madrid:
Un saludo a todos :)

Comentarios
Publicar un comentario