Este es mi entendimiento de un esquema de autenticación con sal / hash:
string plaintextPass = Request.Form["password"];
string salt = UserRecordFromDb.Salt;
string toHash = salt + plaintextPass;
string hash = bcrypt(toHash);
return(hash == UserRecordFromDb.HashedPassword);
El problema es que el algoritmo agrega la sal de una manera predecible . Si pudiera usar una tabla de arco iris para obtener el texto simple incluida la sal , podría encontrar y destruir la sal. Hay suficientes usuarios que utilizan contraseñas incorrectas de todos modos para que el patrón de adición de sal sea fácil de reconocer 1 .
Por ejemplo, si recupero estos plaintexts de mi ataque de la tabla del arco iris:
1: passwordW0fkvE
2: secretJEn3cx
3: t4k3nVdksE12
4: purplehorse1593vE1r
# 3 no me dice mucho. Es una buena contraseña por lo que la sal es irreconocible. Pero desde el # 1 y el # 2 puedo ver que la sal es probablemente 6 caracteres agregados al final. Puedo usar esa información para # 4 para averiguar si la contraseña es purplehorse15
.
1 Nota: si almacena el salt y el paso de nombre de usuario / hash en la misma base de datos, ni siquiera necesito adivinar qué es el salt. Está justo delante de mí. El paso adicional de adivinar la sal solo es necesario si la sal está almacenada en algún otro DB.