Contraseñas con Hash+Salt y Hashes lentos

Últimamente han estado apareciendo varias noticias en donde se ven comprometidas las cuentas y contraseñas de los usuarios de diferentes sitios webs y empresas. Debido a eso, han empezado a sonar mucho como es el sistema que las compañías usan para proteger dicha información.

Dejando de lado los métodos que se saben inseguros o a medias, como el guardar passwords en texto plano, o con un cifrado de doble sentido con la llave alojada en el mismo servidor o el uso de hashes a secas, los cuales se pueden vulnerar usando rainbow tables. Hay dos sistemas que están siendo bastante nombrados hoy en día, estos son el uso de hashes más salt y el uso de hashes lentos.

Antes que nada, ¿Qué es un hash?

Un hash es un código que se obtiene tras aplicar un algoritmo especial a una cadena de texto. Es decir que si tenemos, por ejemplo, una contraseña 123secreto456 y le aplicamos un hash SHA-1 obtendremos el valor 04c6f29a901a600b6fc4bf08a0a942000c902b4f. Ademas, esto no es reversible. Es decir yo puedo convertir la contraseña a un hash, pero es imposible decifrar la contraseña a partir del código.

Existen muchos algoritmos de hash, como el conocido MD5, el CRC32, el SHA-1, etc. Aunque esto parece muy seguro, tiene sus vulnerabilidades. En algunos algoritmos, ocurre que dos o más palabras diferentes puede obtener el mismo hash como resultado. Con lo que si tengo el hash y conozco alguna de las palabras que lo originan, no necesito la contraseña exacta, ya que esta otra también funcionará.

Eso, por un lado, es lo que ocurre en las rainbow tables. Estas son tablas con cientos y miles de hashes en donde se conoce la palabra que los origina. Entonces si consigo acceso al hash, busco en la tabla el mismo y veré que lo originó y podré obtener la contraseña. Logicamente, cuanto más sencilla y común sea la password, más chances de que ya esté en una tabla.

Hashes con salt

Los hashes son salt, son como los hashes de toda la vida más un plus de seguridad. En este caso el truco está en la salt que se le agrega. Salt es un número de dígitos aleatorios que se le agrega al hash ya sea al principio o al final. Con lo que los hashes ya no son los normales y por ende no figurarán en una tabla haciendo más dificil el decodificarlos. Ya que se deberá probar no solo con cada hash, sino tambien con cada salt y sus combinaciones.

Hashes lentos

En este caso, la idea es otra. Se usa el hash como siempre hasta ahora, pero el algoritmo que codifica es lento. Es decir uno puede configurar para que el proceso demore varios minutos, lo que lo vuelve más trabajoso a la hora de un ataque de fuerza bruta.

Por ejemplo, si un ataque de fuerza bruta en un hash rápido para ir tirando palabras y conviertiendolas a hash para comprobar si coinciden demora horas. Al usar un hash lento como bcrypt podemos hacer que demore meses, desalentando así lo útil de realizar el ataque.

Entonces

El uso de salt (o sales) y hashes lentos mejora bastante la seguridad. Pero como todo nada es infalible. Es imposible hacer algo invulnerable, pero si es posible hacerlo tan complicado que no valga la pena el intento.

Anuncios