¿Qué es el hashing y cómo protege los datos y contraseñas?

17min

Seguro que has oído hablar del hashing. Si no es así seguramente te hayan nombrado algo como huella digital o cadena criptográfica. Puede ser que todavía no tengas muy claro de qué se trata y cómo se usa para proteger datos personales y contraseñas. Sin complicaciones demasiado técnicas, te explicamos qué es  el hashing y cómo asegurarte de hacerlo de una manera adecuada, según los estándares de seguridad más recomendados.

Índice

¿Qué es el hashing?

Para empezar vamos a definir los conceptos básicos de una manera sencilla. Pues bien, hashing es un un proceso criptográfico en el que cogemos cualquier conjunto de datos (da igual si es una sola palabra o un libro entero) y lo transformamos en una cadena de caracteres sin significado alguno para los humanos. No se trata de una transformación cualquiera, sino una representación única de los datos originales.

A esa cadena la llamamos hash o huella digital y tiene una característica importante: nadie puede hacer el camino inverso para averiguar qué información había al principio.

A diferencia de otros métodos como el cifrado tradicional, aquí no buscamos que el proceso sea reversible (no queremos que a partir de una cadena se consiga el contenido original encriptado). Entonces alguien se podría preguntar ¿para qué lo queremos? pues el objetivo principal con el hashing es asegurar la integridad de los datos, ya que si se cambia cualquier pequeña cosita del contenido original, cambiará la huella digital.

¿Cómo funciona el proceso de hashing?

No es nuestro objetivo entrar en demasiados detalles, porque sería perderse en terminología quizás muy técnica pero sí es importante que entiendas algunas cosas para poder trabajar de manera adecuada en el proceso de hashing.

Básicamente puedes entender este como la aplicación de una serie de funciones matemáticas diseñadas para darnos resultados únicos y estables a partir de una entrada de datos. Obviamente, el proceso de hashing es bastante complejo y requiere que exista una seguridad total para garantizar la integridad de las funcionalidades de seguridad que van detrás.

La entrada de datos (Input) y su transformación algorítmica

Todo arranca con lo que llamamos la entrada de datos, en inglés el input. Esto puede ser cualquier cosa, desde una contraseña a una factura, pero también podría ser una foto o un programa descargado de Internet.

Luego se toma esa entrada de datos y se aplican toda una serie de algoritmos complejos para cambiar lo que había antes y conseguir esa cadena compleja e imposible de reproducir.

Generación de la salida única de longitud fija (Digest)

Como hemos dicho anteriormente, la cadena generada no tiene ningún sentido para humanos pero sí tiene una forma determinada e importante para las máquinas.

Primero debemos saber que tiene siempre una longitud fija. Da igual si metemos una sola letra o el inventario entero de una tienda, el algoritmo siempre nos va a devolver un resultado con la misma longitud. Por ejemplo, si usamos el famoso algoritmo SHA-256, la salida va a tener siempre de 256 bits.

El determinismo: Misma entrada, mismo resultado siempre

Esta es una regla de oro que hace que el hashing se pueda usar para procesos que tienen que ver con la seguridad. El algoritmo es 100% determinista. Esto quiere decir que si metes exactamente la misma palabra diez mil veces siempre te dará la misma cadena de resultado.

Gracias a esta propiedad, podemos validar si dos archivos o contraseñas son iguales comparando únicamente sus hashes, sin que sea necesario que conozcamos el contenido real de la contraseña almacenada en la base de datos.

El efecto avalancha y la sensibilidad a cambios mínimos

El efecto avalancha es algo importante de cualquier sistema de hashing y básicamente consiste en que un mínimo cambio en el input proporcionará cadenas totalmente distintas. Es decir, si cambias una sola letra, una mayúscula por una minúscula o añades una coma, el hash resultante cambiará por completo y no se parecerá en nada al anterior.

La irreversibilidad o propiedad de un solo sentido

Por último, debemos saber que los hash son irreversibles. O por lo menos deberían serlo para considerarse seguros. Se trata de un proceso de un solo sentido, por lo que si tienes el hash en tus manos, te va a resultar prácticamente imposible reconstruir la información original.

El hashing en la protección de contraseñas

La utilidad más frecuente de los hash es almacenar contraseñas. Así que vamos a profundizar para ver cómo se hace esta tarea.

El peligro del almacenamiento de credenciales en texto plano

Para empezar, como debes saber, nunca se guardan las contraseñas tal y como las escribe el usuario. Sería una puerta de entrada a miles de problemas de seguridad. Para empezar, si una base de datos se ve comprometida, los atacantes se llevarían todas las claves de los usuarios.

El hashing evita este problema, ya que en los servidores solo vamos a almacenar el digest (la huella digital), manteniendo tu clave real a salvo de miradas indiscretas, o incluso de los propios desarrolladores del software.

El proceso de verificación de identidad sin conocer la clave real

Seguro que te preguntas ¿cómo sabe una web que tu contraseña es la correcta si no la tiene guardada? pues es muy fácil. Simplemente se tiene que realizar de nuevo el proceso de hashing y comprobar si los dos hash son iguales (el que hay en la base de datos y el que se acaba de producir con la clave introducida).

Como es un sistema determinista y da respuestas únicas, al hashear el input con la clave usada para loguearse, si comprobamos que es igual que el que tenemos guardado en la base de datos, quiere decir que es la clave verdadera.

Uso de Salt para añadir aleatoriedad contra ataques precalculados

Una práctica común en los sistemas consiste en añadir un salt (sal) que básicamente consiste en un trozo de texto aleatorio que se pone a tu contraseña justo antes de pasarla por el algoritmo.

De esta manera le pones un poco más difícil a los delincuentes hacer algo si consiguen descifrar el hash, o cuando realizan ataques basados en listas de hashes ya calculados.

Implementación de Pepper para una capa de seguridad física extra

Otra cosa que también se hace es añadirle un pepper (pimienta) que es otro valor secreto que mezclamos con la contraseña, pero con una gran diferencia: no se guarda en la base de datos junto al hash. Por ejemplo se guarda como variables de entorno en el servidor, lo que hace que los atacantes necesiten tener acceso a más información todavía para poder hacer alguna cosa con los hashes.

El concepto de Work Factor y la ralentización de la computación

El work factor es otro concepto que afecta directamente al tiempo que requerirá un ordenador en calcular un hash. A mayor work factor más cantidad de procesamiento será necesario para descubrir por fuerza bruta una contraseña a partir del hash.

Obviamente, cuando se trata de una contraseña única, cuando realiza un inicio de sesión, al servidor no le cuesta demasiado hacer esa conversión a hash de manera individual, con lo que no es tan problemático aumentar el tiempo de trabajo. Pero para un atacante que haya conseguido los hash de los usuarios y pretenda obtener la contraseña a partir de ellos el trabajo es mucho más arduo y costoso, en la medida que se aumenta el work factor.

Algoritmos de hashing más comunes y su nivel de seguridad

Vamos a ver ahora cuáles son los algoritmos de hash más usados en estos momentos. No solo por ponerles nombre a estos algoritmos de hashing, sino sobre todo para que puedas saber también los niveles de seguridad que ofrecen y cuáles son totalmente desaconsejados.

SHA-256 y la familia SHA-2

SHA-256 es un algoritmo que pertenece a la conocida familia SHA-2. Se usa en un montón de sitios y certificados de seguridad, incluso en el mundo de las criptomonedas.

Es una opción muy robusta y segura para muchas aplicaciones generales, aunque debemos tener en cuenta que, al ser muy rápido procesando datos, no está diseñado ni recomendado específicamente para el almacenamiento de contraseñas.

SHA-3 (Keccak)

Aquí nos encontramos ante una alternativa moderna a SHA-2 que en este caso usa una vía matemática totalmente distinta llamada Keccak.

Este algoritmo ofrece una seguridad altísima y una gran resistencia a los ataques conocidos, pero sigue sin ser recomendado para contraseñas.

Argon2

Este algoritmo es actualmente el más potente para el hashing de contraseñas, siendo el ganador de la Password Hashing Competition. Lo más importante que podemos destacar de Argon2 es que está pensado específicamente para frenar los ataques que usan hardware especializado superpotente para conseguir contraseñas a partir de hashes. Además es posible configurar con él tanto la memoria como el tiempo que necesita para ejecutarse.

Bcrypt

Bcrypt es uno de los algoritmos más clásicos para tema de contraseñas. No es el más potente y actualmente ha sido superado por Argon2 pero sigue siendo una buena alternativa para claves.

Su mayor protección se basa en poder usar el mencionado work factor para conseguir seguridad de sobra para que los atacantes tengan que sudar la gota gorda para conseguir descifrar un hash.

Scrypt

Scrypt es otro algoritmo un poco curioso porque por diseño hace que se consuma mucha memoria RAM, lo que hace complicado a los atacantes usar hardware con procesamiento en paralelo para ir más rápido a la hora de romper claves.

MD5

Aunque bastante conocido, MD5 a día de hoy está totalmente obsoleto y no se considera seguro y mucho menos aconsejable. Además tiene un problema que resulta fatal para los algoritmos de hash y es vulnerable a colisiones. Esto quiere decir que dos datos distintos podrían dar el mismo hash Por tanto, sobra decir que ya no debemos utilizarlo bajo ningún concepto en temas de seguridad.

SHA-1

Es otro algoritmo bastante desfasado. Igualmente es bastante conocido pero resulta problemático por generar colisiones de datos, además que es muy rápido y por eso fácil de burlar. SHA-1, por tanto, tampoco se debe usar para temas de seguridad.

Aplicaciones prácticas del hashing más allá de las contraseñas

El hashing no se usa solamente para almacenar contraseñas, en realidad tiene muchas aplicaciones prácticas que resultan bastante relevantes en el día a día.

Verificación de la integridad de archivos y sumas de comprobación (Checksums)

Algo bastante típico es usar los hashes para verificar que un archivo no ha sido alterado por otras personas. Esto puede ser útil a la hora de distribuir software o datos, como medida de seguridad para saber si se alteró durante la descarga. Si el hash coincide puedes tener la certeza que no se corrompido durante la transferencia.

Por ejemplo, en la nueva normativa de facturación en España VERIFACTU se usan hashes para garantizar que los emisores de las facturas no cambian las facturas una vez se han emitido.

Estructura de datos en Blockchain

Seguro que has oído hablar de las tecnologías blockchain, ¿no? pues el hashing es un componente vital de este tipo de estructuras y básicamente consiste en enlazar cada bloque con un hash con el bloque anterior. De este modo se consigue una cadena inmutable porque si cambia cualquier pequeña cosa, tendríamos que cambiar los elementos enlazados y a su vez los enlazados, lo que hace imposible que se altere la cadena en su conjunto.

Volviendo a VERIFACTU, la Agencia Tributaria también exige que se encadene una factura a la anterior, produciendo esta cadena de hashes que hace que no se puedan introducir facturas entre medias, para evitar algunas costumbres de empresas que se hacían con la intención de defraudar.

Implementación de firmas digitales y autenticidad de documentos

Las firmas digitales utilizan los mismos hash para generar un resumen del documento. Todo esto luego se cifra con una clave privada para darle todavía más seguridad y al final se consigue garantizar la integridad del contenido y a la vez su autenticidad.

Gestión eficiente de bases de datos mediante Tablas Hash

Las tablas hash es algo que usan las bases de datos para almacenar y recuperar datos de forma extremadamente eficiente, mediante una clave transformada en un índice. Con ello se consiguen mayores velocidades de acceso a los datos.

Identificación única de activos digitales y control de versiones

Los hashes también se utilizan para generar identificadores únicos de archivos o recursos y sus aplicaciones son diversas. Por ejemplo, Git emplea hashes para identificar commits y el contenido.

Deduplicación de datos en sistemas de almacenamiento masivo

En sistemas de almacenamiento, el hashing permite identificar bloques de datos idénticos, lo que ayuda a optimizar el espacio. Si el hash es el mismo indica que ese bloque de datos ya lo tienes en el sistema.

Seguridad en protocolos de red y certificados SSL/TLS

Los protocolos de seguridad más conocidos como SSL/TLS utilizan funciones hash en protocolos más complejos en los que se dan diversos procesos como el handshake, generación de claves y verificación de integridad de mensajes.

Amenazas y ataques comunes a las funciones hash

Bien… llegamos al punto más conflictivo y delicado de las funciones de hash y es justamente los problemas que pueden surgir al usarlos, así como los ataques más frecuentes de seguridad que se hacen para burlarlos.

Ataques de fuerza bruta

Este tipo de ataque ya lo hemos mencionado y consiste en probar todas las combinaciones posibles hasta encontrar una que genere el hash objetivo. Por ejemplo se prueban claves convirtiendo cadenas en sus correspondientes hash, hasta encontrar una que coincide.

Este tipo de ataques puede ser efectivo contra contraseñas débiles o hashes rápidos pero la verdad es poco útil cuando se usan algoritmos costosos y configuraciones adecuadas.

Ataques de diccionario

Los ataques de diccionario son una variante un poquito más sofisticada de los ataques de fuerza bruta tradicionales. En realidad solo cambia que, en lugar de probar todas las combinaciones con claves aleatorizadas, se realizan contra diccionarios que tienen listas de contraseñas comunes y patrones conocidos para producirlas.

Es un enfoque más eficaz cuando los usuarios son desprevenidos y usan claves clásicas (algo más frecuente de lo que podría parecer).

Rainbow Tables (Tablas Arcoíris) y la búsqueda de hashes precalculados

Otra cosa que se puede hacer es usar rainbow tables o tablas arcoíris. Básicamente se hace el paso contrario, se usan hashes precalculados para una gran cantidad de posibles contraseñas, a fin de encontrar algún hash que coincida.  Solo que si se usan mecanismos como el salt (mencionado antes) son literalmente ineficaces.

La paradoja del cumpleaños y la búsqueda de colisiones accidentales

Este tipo de ataque es bastante curioso y se explica por la paradoja del cumpleaños. Esta paradoja básicamente demuestra lo fácil que es encontrar dos personas que cumplan años el mismo día. En un principio podríamos pensar que, para conseguir con una probabilidad mayor que el 50% de que dos personas cumplan años en el mismo día, necesitaríamos un número grande de personas. Sin embargo la realidad es que con 23 personas tenemos asegurado un 50% de posibilidades o más. Cuando estudias estadística y probabilidad es una de las primeras cosas que te explican. Tienes más información en Wikipedia si te interesa.

Pues bien, esta misma paradoja ocurre cuando se usan algoritmos de hash que tienen colisiones. Encontrar una colisión entre dos documentos que den el mismo hash no es tan complicado como parece y eso hace que algoritmos débiles como MD5 o SHA-1 sean muy poco aconsejados.

El impacto de la computación cuántica en los algoritmos tradicionales

En la medida en la que los ordenadores van siendo más potentes, se vuelven más poderosos para burlar las medidas de seguridad, ya que pueden descifrar códigos con rapidez. Es por eso que los algoritmos cada vez deben ser más potentes. Sin embargo, a la vuelta de la esquina tenemos una nueva tecnología que lo cambiará todo. Se trata de la computación cuántica, un nuevo formato de ordenadores totalmente disruptivo que supera en mucho a las posibilidades de las máquinas actuales.

Se prevé que en una década más o menos las empresas tengan a su alcance ordenadores cuánticos. Seguramente a nivel de consumo tardarán un poco más en introducirse al mercado, pero para entonces todos los mecanismos de hashing tendrán que haber evolucionado porque los actuales sin lugar a dudas se volverán obsoletos.

¿Cómo implementar buenas prácticas de hashing en tu desarrollo?

Ahora vamos a dar algunos consejos importantes para aplicar correctamente el hashing, comenzando por la selección del algoritmo adecuado.

Selección de algoritmos resistentes a ataques de hardware masivo

Hoy es importante utilizar algoritmos confiables y su estamos haciendo hashing de contraseñas escoger aquellos diseñados específicamente para esta tarea, como Argon2, Bcrypt o Scrypt. Estos algoritmos son adecuados porque introducen costes computacionales y de memoria que dificultan ataques con GPUs o sistemas de computación avanzados.

Generación de sales únicas y criptográficamente seguras por usuario

Todas las cuestiones que hemos señalado al principio de este post son importantes para evitar que las claves se puedan desproteger con diccionarios de hashes. Por ello, cada usuario debe tener un salt único generado mediante funciones criptográficamente seguras.

Con esta pequeña variación se evita que dos contraseñas iguales produzcan el mismo hash y protege frente a ataques precalculados.

Configuración adecuada de parámetros de coste (Iteraciones y memoria)

Otra cosa que soportan los algoritmos modernos es ajustar parámetros de coste, como el número de iteraciones o el uso de memoria. Debes subir estos costes para que sean más seguros los hashes, pero balanceando bien con el rendimiento.

Migración segura de esquemas de hash antiguos a estándares modernos

Sobre todo es importante no usar algoritmos obsoletos y, cuando se detectan, realizar las migraciones a soluciones más seguras.

Claro que no puedes hacerlo de golpe, porque no conoces las claves de tus usuarios pero en estos casos lo que se suele hacer es el rehashing durante el login. Esto es, volver a tomar la contraseña válida (cuando el usuario se autentica correctamente) y recalcular su contraseña con el nuevo algoritmo que sepamos que es robusto.

Auditoría de seguridad y validación de librerías criptográficas oficiales

Otra cosa importante es usar las librerías oficiales, que están probadas y se sabe que son seguras. Si usas cualquier mecanismo casero puedes tener problemas de seguridad. Y, por supuesto, conviene auditar los sistemas cada cierto tiempo para garantizar que se usan los estándares de seguridad necesarios.

Sergio Arias

Productos relacionados: