¿Cómo se cifran nuestras contraseñas?
Durante este año hemos asistido a la publicación de multitud de credenciales de diversos servicios tan populares como Dropbox, Adobe, Tumblr, LinkedIn o Badoo. Se ha podido acceder incluso a otros servicios, pero algunas de esas contraseñas obtenidas estaban convertidas a hash, con salt. Aunque suene a receta de cocina, en realidad quiere decir que eran seguras. No vamos a hablar de los mejores métodos de cifrado totalmente inviolables, sino de cómo funciona a grandes rasgos el proceso.
Hash
Un hash consiste en un algoritmo que transforma un texto, como puede ser una contraseña, a una función alfanumérica cuya longitud depende de la complejidad del cifrado en cuestión, pero que suele ser fija para cada tipo de cifrado. Este nuevo texto generado es unidireccional, y no permite descifrar la contraseña haciendo el proceso inverso.
Este proceso es realmente importante a la hora de que nuestras credenciales de cualquier servicio estén seguras. En el caso de que se encuentren en texto plano, cualquier persona con acceso a permisos de administrador puede obtener las contraseñas directamente sin necesidad de intentar descifrarlas.
Cuando nos registramos en una página web, el proceso que ocurre es el siguiente:
- El usuario crea la cuenta con un nombre de usuario o un correo electrónico.
- Introducimos la contraseña, y ésta directamente se convierte a un hash, y es este hash el que se almacena en la base de datos del servicio. En ningún momento la contraseña en texto plano sin cifrar es almacenada en ninguna parte.
- Cuando nos logueamos en la web, al escribir la contraseña, esta se convierte nuevamente en hash, y se coteja con el hash de la contraseña que tiene almacenado el servidor. Si los hashes coinciden, se valida el acceso.
Entonces, ¿cómo consiguen crackear las contraseñas?
Existen dos maneras: mediante diccionarios y mediante ataques de fuerza bruta.
Los ataques mediante diccionario utilizan archivos que contienen palabras y contraseñas comunes. Cada palabra contiene su hash asociado en el diccionario, con el cual se compara cada hash de las contraseñas. Si coinciden, se sabe entonces cuál es la contraseña.
Por otro lado, un ataque por fuerza bruta prueba cualquier combinación de caracteres de una determinada longitud. Es por ello que cuanto más larga sea una contraseña, más difícil de descifrar será por este método. El problema de este método es que se necesitan ordenadores demasiado potentes, y en el futuro, los ordenadores cuánticos podrían acabar con los métodos tradicionales de este tipo de cifrado.
En la web de Crackstation tienen un conversor de hash a texto normal. Estos son cotejados con diccionarios que tiene la propia web, que ocupan cientos de GB, con miles de millones de palabras con sus respectivos hashes. En esta web, podéis convertir cualquier texto a SHA256. Abajo os dejamos tres ejemplos. Con el primero y el segundo tendréis suerte, pero con el tercero no obtendréis resultado, pues el nombre de la web no se encuentra en el diccionario de Crackstation.
- edf9cf90718610ee7de53c0dcc250739239044de9ba115bb0ca6026c3e4958a5 se traduce a ‘contraseña’
- 65e84be33532fb784c48129675f9eff3a682b27168c0ea744b2cf58ee02337c5 se traduce a ‘qwerty’
- 458dc7c6c1b2f2cad8b7b11ddcbb8b06ae81e277865d9abdd8ef5738b10d31c6 se traduce a ‘adslzone.net’
Si es tan fácil, ¿cómo se hacen indescifrables las contraseñas?
Fácil. Con la introducción de caracteres aleatorios, en un proceso conocido como ‘salt’ en inglés. Cuando introducimos una contraseña, a ésta se le añaden caracteres aleatorios al final. De esta manera, dos contraseñas iguales tendrán hashes distintos.
Para comprobar si la contraseña es correcta, se necesita el salt añadido a la contraseña, el cual se guarda en la base de datos de la cuenta como una parte situada al azar dentro del propio hash, siendo de esta manera imposible saber qué parte se debe al azar y cuál es realmente parte de la contraseña.
Para generar el salt hay distintos métodos, y cuanto mejor sea el algoritmo de generación de caracteres aleatorios, y más escondido esté dentro del hash, más seguro será éste.
Errores comunes al usar ‘salt’ en una contraseña
Un error común suele ser utilizar el mismo grupo de caracteres aleatorios para todas las contraseñas. De esta manera, se puede ver claramente cuál es la diferencia que añade al hash con sólo añadir el salt al diccionario con el que hace las comprobaciones. Otro fallo suele ser utilizar el propio nombre de usuario como ‘salt’.
Si el ‘salt’ es demasiado corto, se pueden hacer diccionarios que permitan adivinarlos. Por ello, una buena regla a seguir es que el salt sea como mínimo del mismo número de bytes que el cifrado que utilicemos. Un SHA256 tiene 256 bits, es decir, 32 bytes, por lo que el salt deberá ser como mínimo de 32 bytes.
Para cifrar contraseñas, es recomendable no utilizar funciones de hash de cifrado tales como SHA256, SHA512, RipeMD o WHIRLPOOL, las cuales ya hemos visto que son fáciles de descifrar si no tienen salt. Es mejor utilizar algoritmos complejos, tales como PBKDF2, bcrypt y scrypt.