¿Qué significa agregar una “sal” a una contraseña / hash?

Imagine que necesita autenticar a los usuarios en un sitio web utilizando una contraseña. La solución más obvia es almacenar la contraseña sin procesar en un archivo y compararla con la contraseña que ingresaron. Esto tiene el problema de que cualquier violación del archivo de contraseña revela las contraseñas reales del usuario. Estos pueden usarse para entrar en las cuentas del usuario en otros sitios y eleva la gravedad del problema de un problema local a uno mucho más grave.

Para resolver este problema, podemos “hash” la contraseña, utilizando una función unidireccional que convierte la contraseña de texto sin formato en un nuevo valor. Luego es posible comparar el hash de la entrada del usuario con el hash almacenado, pero es difícil tomar un hash en particular y descubrir qué contraseña se usó para generarlo.

Sin embargo, hay un problema: un atacante podría calcular previamente una tabla de, por ejemplo, los valores hash de cada contraseña de 10 caracteres, o los valores hash de cada palabra común, y usar eso para descubrir qué contraseña se utilizó para generar el hash. Para resolver este problema, la sal (una cadena aleatoria pero conocida) se agrega a la contraseña antes del hash. Esto no es necesariamente un secreto, pero obliga a un atacante a volver a calcular todos los hashes de contraseñas posibles para cada usuario.

Incluso esto no es una protección perfecta: un atacante dedicado podría forzar de forma bruta los valores hash para la contraseña de un usuario en particular. Es por eso que es importante también exigir contraseñas complejas (aumentar el espacio de búsqueda) y utilizar un mecanismo costoso de hash (aumentar el costo de búsqueda).

PKCS # 5, Sección 4 (Estándar de criptografía basado en contraseña) tiene una discusión más completa de estos temas: http://www.rsa.com/rsalabs/node….

Antes de entrar en sal, debemos entender por qué necesitamos un hashing fuerte en primer lugar, por lo que, según la seguridad, el 55% de los usuarios usa la misma contraseña para la mayoría de los sitios web, lo que implica que si un sitio web almacena su contraseña en el texto plano se ve comprometido, el pirata informático no solo puede obtener acceso a su cuenta en ese sitio web, sino a todas sus cuentas de redes sociales, correo electrónico, foros, etc. en las que está utilizando la misma contraseña, y ese es solo un escenario común, hay variedad de otros escenarios donde esto puede ser abusado en extensiones más grandes.

Hay muchas formas a través de las cuales el proceso de recuperación y uso de contraseñas de una determinada base de datos / servidor puede ser engorroso para el pirata informático, uno de los cuales es el hash que utiliza una función criptográfica unidireccional (SHA-2, bcrypt). …) mientras incorpora otros factores (no. De iteraciones, intensidad de memoria, tiempo de computación …) y genera una salida de longitud fija, lo que le permite almacenar esas contraseñas en texto ilegible que en caso de incumplimiento del sistema no expondrá las contraseñas en su forma legible real (texto sin formato).

Ahora, existen tablas de búsqueda y ataques de tablas de arco iris (para obtener más información) donde un atacante calcula previamente los hash de las contraseñas y las almacena en una estructura similar a un diccionario (junto con su contraseña correspondiente), que si coincide (con por ejemplo, una lista de contraseñas filtradas del servicio xyz) proporcionará la contraseña real detrás de esas cadenas de hash al atacante (aunque el tiempo requerido para ejecutar con éxito y obtener los resultados deseados depende de la técnica utilizada); Otras preocupaciones incluyen escenarios en los que varios usuarios tienen la misma contraseña, etc. Aquí es donde se agrega la sal (una cadena aleatoria) al agregarla o anteponerla a la contraseña antes del hash, lo que aleatoriza aún más cada contraseña y mitiga un nivel adecuado de riesgo involucrado con ataques mencionados anteriormente.

Por último, los problemas comunes asociados con la sal es su reutilización y / o uso de una sal corta , lo que no se recomienda (según las mejores prácticas). Como buena regla general: use una sal generada aleatoriamente que tenga el mismo tamaño que la salida de la función hash. Por ejemplo, la salida de SHA256 es de 256 bits (32 bytes), por lo que la sal debe ser de al menos 32 bytes aleatorios.