Recientemente el popular foro HTCMania ha sufrido un robo de su base de datos afectando a 1.5 millones de usuarios. Actualmente en servicios como HaveIBeenPwned ya han dado de alta la base de datos, para comprobar si nuestra cuenta de email está afectada. En este artículo os vamos a explicar la importancia de guardar las contraseñas de los usuarios hasheadas, y no guardarlas en texto claro.
El robo de datos en HTCMania: así ocurrió
Los atacantes realmente no atacaron el portal de HTCMania, sino directamente a su proveedor de Hosting, Comvive, y posteriormente se hicieron con su base de datos con una gran cantidad de información. La información que hay en esta base de datos que le han robado a HTCmania es:
- Nombre de usuario
- Dirección de correo electrónico
- Contraseña (hasheada)
- Histórico de contraseñas (hasheada)
- Direcciones IP desde donde se conectan los usuarios
- Fecha de cumpleaños
El administrador del foro de HTCMania, Jorgekai, explicó a principios de marzo que se había detectado un posible acceso no autorizado en el foro, y recomendaba cambiar la contraseña a todos los usuarios cuando entraban al foro.
Un detalle importante es que el administrador de HTCmania, no envió un correo electrónico masivo a todos los usuarios registrados, según el administrador no lo hizo porque durante muchos años no pidieron el correo de registro. ¿Y los que sí tenían su email? Pues si no entraban en HTCmania, o leían en diferentes webs que les habían hackeado, no se enteraría nunca de que este problema de seguridad tan grave había ocurrido.
Por este motivo, es siempre recomendable utilizar una contraseña diferente para cada uno de los servicios online donde nos registremos, para que si un servicio es hackeado (como HTCmania), otros servicios no se vean afectados, ya que casi siempre utilizamos el mismo correo electrónico y los cibercriminales podrían acceder a otras cuentas nuestras una vez descifrada la contraseña.
La importancia de guardar el hash de la contraseña en las bases de datos
Una de las prácticas fundamentales para almacenar las contraseñas en la base de datos de usuarios, es almacenar el hash de la contraseña, jamás se debe almacenar una contraseña en texto plano. ¿Qué es el hash de una contraseña? Un hash es un algoritmo que se encarga de “convertir” un valor en otro, uno de los objetivos de las funciones hash es comprobar si un archivo ha sido modificado (comprobar la integridad), pero también sirve para guardar con seguridad las contraseñas en una base de datos debido a las características de un hash.
Una de las principales características de una función hash es que no se puede obtener el texto original (la contraseña), a partir de la huella digital (el hash). Esta característica es muy importante, porque con el hash de una contraseña, no se puede obtener la contraseña en sí, es una función de un solo sentido. En caso de querer obtener la contraseña, deberemos probar millones de combinaciones posibles (ataque por fuerza bruta o diccionario), aplicar el hash a cada una de las contraseñas, y posteriormente comparar los hashes. Si al comparar los hashes son iguales, la contraseña que hemos probado es la correcta y ya la habremos crackeado, si no, seguimos con la siguiente contraseña a probar.
Otra característica de una función hash, es la imposibilidad de encontrar un conjunto de datos diferentes que tengan la misma huella digital, es decir, si tenemos dos contraseñas diferentes y aplicamos la función hash, el resultado debe ser diferente siempre, si el resultado es el mismo, habremos encontrado lo que se denomina una «colisión», y esa función hash no es segura. La probabilidad de encontrar una colisión en una función hash debe ser mínima, aunque siempre existe esta posibilidad porque el origen de los datos es infinito, pero al aplicar la función hash es finita (tenemos una salida de una cierta cantidad de bits). Una función hash se considera segura si no se conocen colisiones.
Por último, las funciones hash también tienen la propiedad de que son capaces de transformar un texto de longitud variable (una contraseña), en una huella de tamaño fijo de ciertos bits. Si, por ejemplo, usamos SHA2-256, tendremos una salida de 256 bits. En cuanto a esta última propiedad, hoy en día existen funciones hash que tienen una longitud de salida diferente, dependiendo de cómo es la entrada así será la salida.
Si estamos hasheando contraseñas almacenadas en una base de datos, es recomendable utilizar unos algoritmos de hashing u otros. Por ejemplo, en el caso de las contraseñas almacenadas, es recomendable que el algoritmo hash tarde un tiempo en aplicar la función de por ejemplo 5 segundos, pero que luego sea muy robusto y sea muy costoso el poder crackearlo con la potencia de las GPU o CPU actuales.
¿Qué algoritmo de hash utiliza HTCMania para asegurar las contraseñas de sus usuarios?
En el caso de HTCmania, han comentado que utilizan el algoritmo de hash MD5, en concreto, lo que hacen es utilizar un MD5 doble con salt. Este es el método de hash que utiliza de manera nativa el foro de vBulletin que utiliza HTCmania, un método que no es nada seguro porque utiliza MD5, un algoritmo que lleva muchos años siendo inseguro ya que se han encontrado colisiones, y, además, es muy rápido de crackear con programas como Hashcat y una GPU de las actuales. Cualquiera de nosotros en nuestros hogares con un PC de gama alta, podría ponerse a crackear millones de contraseñas con cierta facilidad utilizando las herramientas adecuadas.
Aunque utilicen dos iteracciones de MD5, lo que se hace con esto es tardar en torno al doble para poder adivinar la contraseña, pero no es recomendable su utilización por seguridad, ya que es muy rápido de calcular, y con programas gratuitos como Hashcat, y utilizando la potencia de cómputo de las GPU de hoy en día, es realmente rápido poder crackear estas contraseñas. Por ejemplo, para un hardware de una CPU Intel Core i7-6700K y una GPU Nvidia RTX 2080 Founders Edition, se puede crackear el hash md5($salt.md5($pass)) como el de HTCMania a una velocidad de unos 10406.6 MH/s, 1MH/s significa 1 millón de hashes de contraseñas por segundo.
Actualmente existen hashes más seguros para almacenar contraseñas, como SHA2-256, o SHA2-512. No obstante, existen funciones de hash que están específicamente diseñadas para usarlas con contraseñas. Algunas de las funciones hash recomendables para almacenar contraseñas son scrypt y Argon2, por ejemplo. En el foro de ADSLZone utilizamos XenForo, y este foro utiliza una criptografía bastante más robusta, concretamente utiliza sha256(sha256(password) . salt) que es mucho más seguro que MD5 de HTCMania.
Tal y como habéis visto, almacenar el hash de las contraseñas de los usuarios es fundamental, pero también es importantísimo utilizar un hash robusto y que se considere seguro actualmente, y no utilizar MD5 que hace años dejó de ser una alternativa válida.