¿Qué es hash?
Hashing es el proceso de convertir cualquier tipo de datos (generalmente contraseñas o archivos de instalación) en una string de longitud fija. Hay varios tipos de hash, pero para este artículo, solo veremos el hash MD5. MD5 es un ejemplo de un método hash. Por ejemplo, el hash MD5 de «hola» (sin las comillas) es «5d41402abc4b2a76b9719d911017c592» (sin las comillas). Del mismo modo, el hash MD5 de «Geeks for Geeks» (sin las comillas) es «5ee878924e0cb782e0729066a7d88832» (sin las comillas). Notarás que aunque «Geeks for Geeks» es más largo que «hello», sus hashes MD5 tienen la misma longitud . Esto es lo que hace que los hashes sean vulnerables y de lo que hablaremos más adelante en este artículo.
¿Por qué usamos hashes?
Los hashes tienden a tener algunos casos de uso general:
- Seguridad de contraseña
- Garantizar descargas correctas
- Verificación de integridad de imagen
En este artículo, analizaremos el hashing a través de la lente de la seguridad de las contraseñas, ya que este es su caso de uso más común.
Seguridad de contraseña:
muchas veces, un sitio web necesita tener un formulario de inicio de sesión para autenticar a sus usuarios. Por lo general, estos sitios web tienen muchos usuarios diferentes y necesitan almacenar su información de inicio de sesión en algún tipo de base de datos. Sin embargo, almacenar contraseñas como texto sin formato en una base de datos es increíblemente inseguro.
Por ejemplo , supongamos que un pirata informático logró ingresar a la siguiente base de datos de información de inicio de sesión almacenada en un sitio web:
Nombre de usuario |
Clave |
administración | Admin_securep@$$w0rd |
johnnyappleseed123 | ja.5923! |
zadiben | 15 de noviembre de 1982 |
A partir de esta tabla, se vuelve claramente obvio cuál es la contraseña de cada usuario. Además, el hacker acaba de obtener acceso a la cuenta de administrador y ahora puede controlar varios aspectos del sitio web. En cambio, el sitio web decide almacenar contraseñas utilizando sus hashes MD5. Explorando este escenario, digamos que el hacker logra ingresar a la nueva base de datos del sitio web. Esto es lo que ven –
Nombre de usuario | Hash de contraseña |
administración | 865c5895f347413ca07c81e6c365cb31 |
johnnyappleseed123 | a55805ec1caef94681bb07271659c887 |
zadiben | ae93717757ecfb103847b6752b88ed36 |
Ahora, todo lo que el hacker puede ver es el hash de la contraseña y teóricamenteno puede iniciar sesión en ninguna de estas cuentas. Sin la contraseña real, el hash es (nuevamente, teóricamente) inútil para el hacker. Pero ahora, ¿cómo podrá el sitio web autenticar a sus usuarios? En lugar de comparar la contraseña ingresada por el usuario con la base de datos, el sitio web verificará el hash de la contraseña ingresada por el usuario. Si ese hash coincide con el hash en la base de datos, ¡el usuario está autenticado! Esto se debe a que el hash MD5 de «Admin_securep@$$w0rd» siempre será «865c5895f347413ca07c81e6c365cb31» (los hashes más seguros, como BCrypt, utilizan métodos de hash más complejos, así como métodos más complejos para comparar dos hashes, pero, en aras de la simplicidad, nos quedaremos con con MD5 por ahora) y, aunque siempre puede pasar de la contraseña al hash, es (teóricamente) increíblemente difícil pasar del hash a la contraseña.
La palabra «teóricamente» se ha usado mucho en este momento, y he aquí por qué.
Descifrado de hash: el descifrado
de hash implica tomar una gran lista de palabras o un diccionario y codificar cada palabra. Luego, compara el hash de cada palabra en el diccionario con el hash que está tratando de descifrar. ¡Una vez que haya encontrado una coincidencia, habrá encontrado su palabra! Es por eso que no se recomienda usar palabras comunes como contraseña.
Refiriéndose al ejemplo anterior, el pirata informático obtuvo acceso a la base de datos de inicio de sesión del sitio web y esta era una de las líneas en la base de datos:
Nombre de usuario |
Hash de contraseña |
pharrell157 | 5f4dcc3b5aa765d61d8327deb882cf99 |
Debido a que el pirata informático no se da por vencido solo porque las contraseñas tienen un hash, ejecutarán este hash a través de un cracker de hash (que se compara con hashes de uso muy común) como este . Es una simple cuestión de escribir hash «5f4dcc3b5aa765d61d8327deb882cf99», resolver el reCaptcha y obtener un resultado:
Ahora, el hacker sabe que la contraseña de pharrell157 es simplemente «contraseña» en un par de segundos usando una herramienta en línea gratuita.
Esta es una de las principales razones por las que un hash MD5 no es seguro. Debido a que es un hash sin sal (a diferencia de BCrypt), el mismo hash resulta de los mismos datos cada vez. Es decir, el hash MD5 de “contraseña” siempre será “5f4dcc3b5aa765d61d8327deb882cf99.
Además del descifrado de hash (que es algo a lo que todo hash es vulnerable), MD5 es increíblemente inseguro por otra razón más importante.
Colisiones de hash:
Hay infinitas combinaciones posibles de cualquier número de bits en el mundo. Por lo tanto, hay una cantidad infinita de datos posibles que se pueden codificar. Tenga en cuenta la definición de un hash anterior que establece que un hash siempre tiene una longitud fija. Por ejemplo, el hash MD5 siempre tiene una longitud de 128 bits (comúnmente representado como 16 bytes hexadecimales). Por lo tanto, hay 2^128 hashes MD5 posibles. Si bien este es un número extremadamente grande, ciertamente es finito… aunque el número de posibles contraseñas que se pueden cifrar es infinito. Lo que esto significa es que infinitas contraseñas diferentes tienen el mismo hash. Esto también significa que si un pirata informático obtiene acceso a los hash MD5 de las contraseñas, no necesariamente necesita encontrar la contraseña real, sino algo más que comparte ese hash. Debido a las recientes innovaciones en tecnología, encontrar colisiones en hashes MD5 es casi trivial. Para obtener más información, consulte el proyecto de Marc Stevens,HashClash , o el repositorio GitHub de Corkami sobre colisiones .
¿Qué podemos usar en lugar de MD5?
Afortunadamente, ahora que MD5 no proporciona el mismo nivel de seguridad que podríamos esperar, se han creado muchos hashes nuevos que sí pueden. Por ejemplo, el SHA-256 (también conocido como SHA-2) es más seguro porque tiene una longitud de 256 bits en lugar de 128. Ahora, la mayoría de los sitios web usan hashes salados como BCrypt, que pueden crear diferentes hashes a partir de la misma contraseña siempre que haya un sal variable (o semilla). Los hashes MD5 aún se pueden usar en análisis forense digital en algunos casos, pero en su mayoría han sido reemplazados por estas alternativas más seguras.