Parece como si entendieras que el hash es una función criptográfica de una sola vía. Una cadena con hash sin un salt usando un algoritmo específico siempre producirá el mismo resultado. Los hash no están destinados a ser descifrados, están destinados a ser comparados con.
Una cadena de password
con hash en MD5 sin una sal siempre será 5f4dcc3b5aa765d61d8327deb882cf99
. Cuando el usuario ingresa su contraseña para ingresar al sitio web súper secreto, su valor de contraseña (en este caso, password
) se revisa y se compara con el hash que existe en la tabla de "usuarios" para ese usuario. Si los dos hashes coinciden, se otorga acceso.
Como sabemos que el hash de una cadena siempre será el mismo sin sal, la cantidad masiva de hashes de cadenas se puede calcular previamente en lo que se denomina tablas Rainbow. Si una base de datos se ve comprometida y no se ha usado sal, a menudo es trivial (dependiendo del algoritmo y la complejidad de la contraseña) para determinar la contraseña comparándola con un hash que existe en la tabla del arco iris.
Al agregar un sal que se genera aleatoriamente a la cadena y luego hacer un hash, se hacen las cosas exponencialmente más difíciles para atacar el hash con tablas de arco iris precalculadas. Para hacerlo, el atacante tendría que adivinar cuál sería la sal, y luego generar sus tablas de arco iris nuevamente. Esto se vuelve muy ineficiente y lo elimina como una opción viable para el compromiso de contraseña.
Entonces, si nuestra aplicación web para mi registro de usuario tiene un salt de Sup3rS3cr3tS @ l7, cuando inicio sesión o cambie mi contraseña, se agregará salt a la cadena de la contraseña. El valor que se hasheado es Sup3rS3cr3tS@l7password
y el hash MD5 se convierte en 8e28474b10084728115870bcae270298
Las sales
NO necesitan ser usadas globalmente, una sal puede ser generada aleatoriamente en la creación de la cuenta y almacenada en una columna en la tabla de usuarios.
RENUNCIA DE RESPONSABILIDAD No use MD5, ya que fue solo para fines de demostración.