La seguridad y el almacenamiento de contraseñas

Cómo deberían almacenar las contraseñas de usuario los servicios online y cómo minimizar los daños en caso de filtración o ataque.

Cómo almacenar correctamente tus contraseñas de usuario

A estas alturas, a medida que se acerca el final del primer cuarto del siglo XXI, seguramente ya todo el mundo sea consciente de que las contraseñas son puro oro digital y que su protección es clave para garantizar la seguridad y privacidad de los datos. Sin embargo, a pesar de ello, no todas las empresas almacenan las contraseñas correctamente.

En esta publicación veremos cómo NO almacenar las contraseñas de los usuarios y qué métodos utilizan los servicios que sí se toman en serio la seguridad.

Almacenar contraseñas en texto plano: la forma incorrecta

El método más sencillo es almacenar las contraseñas en una base de datos sin cifrar. Por tanto, cuando un usuario intenta iniciar sesión, la autenticación consiste en comparar lo que introduce con lo que hay en la base de datos.

Pero siempre existe el riesgo de que los atacantes roben esta base de datos de una forma u otra, por ejemplo, explotando las vulnerabilidades en el software de la base de datos. O bien, un empleado con malas intenciones y altos privilegios de acceso podría robar un documento de contraseñas. También podrían usarse las credenciales filtradas o interceptadas de los empleados para robar contraseñas. En pocas palabras, hay muchos posibles escenarios en los que las cosas podrían salir mal. Recuerda: los datos almacenados en formato abierto están, como su propio nombre indica, abiertos.

Cifrar las contraseñas: algo mejor

¿Qué pasa si almacenas las contraseñas en forma cifrada? A simple vista, no es una mala idea, pero en la práctica no funciona del todo bien. Después de todo, si almacenas contraseñas cifradas en una base de datos, debes andar descifrándolas cada vez que necesites acceder a una cuenta de usuario.

Eso significa que tendrás la clave de cifrado a mano y, si se diera el caso, esta clave podría caer fácilmente en manos de los ciberdelincuentes, junto con la base de datos de contraseñas. Por tanto, todo este proceso no habría servido de nada: los ciberdelincuentes podrían descifrar rápidamente la base de datos y obtener las contraseñas en texto plano, por lo que volvemos al punto de partida.

Como suelen advertir los criptógrafos, el cifrado no resuelve el problema de la privacidad de los datos: simplemente lo convierte en un problema de almacenamiento seguro de claves. Puedes intentar pensar en algún tipo de estrategia astuta que reduzca los riesgos, pero en general este método no te permitirá proteger tus contraseñas con confianza.

Almacenar los hashes de las contraseñas: la forma correcta

El mejor método consiste en no almacenar contraseñas. Si no tienes algo, no te lo pueden robar, ¿cierto?

Pero ¿cómo se puede comprobar entonces si un usuario que ha iniciado sesión ha introducido la contraseña correcta? Ahí es donde entran en juego las funciones hash: algoritmos cifrados especiales que codifican cualquier dato en una cadena de bits de longitud fija de una forma predecible pero irreversible.

Predecible aquí significa que los mismos datos se convierten siempre en el mismo hash e irreversible, que es completamente imposible recuperar los datos hash del hash. Eso es lo que hace cualquier servicio online si se preocupa, aunque sea mínimamente, por los datos de los usuarios y valora su reputación.

Cuando un usuario crea una contraseña durante el registro, no es la contraseña en sí, sino su hash, lo que se almacena en la base de datos junto con el nombre de usuario. Después, durante el proceso de inicio de sesión, este hash se compara con el de la contraseña introducida por el usuario. Si coinciden, significa que las contraseñas son las mismas.

En caso de filtración de la base de datos, los atacantes no obtienen las contraseñas, sino sus datos hash, de los que no se pueden recuperar los datos originales; son irreversibles, ¿recuerdas? Por supuesto, se trata de una gran mejora en términos de seguridad, pero aún es demasiado pronto para cantar victoria: si los ciberdelincuentes consiguen los datos hash, podrían intentar un ataque de fuerza bruta.

Los hashes “salados”: aún mejor

Después de hacerse con tu base de datos, los ciberdelincuentes podrían intentar extraer las contraseñas mediante fuerza bruta. Esto supone hacerse con una combinación de caracteres, calcular su hash y buscar coincidencias en todas las entradas de la base de datos. Si no se encuentran coincidencias, probarán con otra combinación, y así sucesivamente. En caso de coincidencia, ahora conocerán la contraseña que se utilizó para calcular el hash en la base de datos.

O, lo que es peor, el proceso de descifrado de contraseñas con hash se puede acelerar mediante las llamadas tablas arcoíris, que son enormes conjuntos de datos con funciones hash precalculadas para las contraseñas más frecuentes cuyo objetivo es facilitar la búsqueda de coincidencias en la base de datos robada. Todo esto se hace automáticamente, por supuesto, por lo que el proceso de descifrado de contraseñas se acelera considerablemente.

No obstante, tenemos una buena noticia: no se puede calcular el hash de todas las combinaciones posibles de caracteres de antemano. De hecho, una tabla arco iris completa para cualquier algoritmo hash ocuparía más espacio en disco del que hay disponible en el planeta. Incluso para el algoritmo MD5, que no es de mucha confianza, esta tabla contendría (respira hondo) 340 282 366 920 938 463 463 374 607 431 768 211 456 registros. Por ello solo se incluyen las combinaciones más comunes dentro de estas las tablas arcoíris.

Para combatir el uso de tablas arcoíris, los criptógrafos idearon una solución que utiliza otra propiedad importante de las funciones hash: incluso el más mínimo cambio en el texto principal altera el resultado del hash.

Antes de que una contraseña con hash se compute y escriba en la base de datos, se añaden un conjunto aleatorio de caracteres: la sal. De esta forma, la base de datos con hash se modifica hasta tal punto que ni siquiera las contraseñas más básicas, obvias y frecuentes como “12345678” y “contraseña” pueden conseguirse por fuerza bruta mediante tablas arcoíris.

La variante más simple usa la misma sal para todas las contraseñas. Pero la más resistente a los ataques crea una sal diferente para cada registro individual. Lo bueno de esta estrategia es que las sales se pueden almacenar en la misma base de datos sin riesgo adicional: conocer la sal no facilita mucho la tarea de los atacantes. De hecho, para descifrar los hashes, aún tendrán que aplicar pura fuerza bruta: revisando una a una cada combinación.

Cuantos más servicios online adopten este método de no almacenar contraseñas, menos probabilidades habrá de que se produzca un robo masivo de credenciales de usuario y los problemas posteriores asociados con el hackeo de cuentas.

Consejos