practicas - yii CPasswordHelper: hashPassword y verifyPassword
yii2 login (2)
Creo que me estoy perdiendo algo crítico aquí. En la función CPasswordHelper::hashPassword
tenemos líneas:
$salt=self::generateSalt($cost);
$hash=crypt($password,$salt);
return $hash;
Y en CPasswordHelper::verifyPassword
existe esta línea:
$test=crypt($password,$hash);
return self::same($test, $hash);
¿Qué hay de la sal? Según mi entender, ni siquiera se mantiene, pero no tiene ningún sentido, así que supongo que no lo entendí del todo.
CPasswordHelper funciona como las funciones de PHP password_hash () y password_verify () , son envoltorios alrededor de la función crypt (). Cuando genere un hash BCrypt, obtendrá una cadena de 60 caracteres, que contiene la sal.
// Hash a new password for storing in the database.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);
La variable $ hashToStoreInDb ahora contendrá un valor hash como este:
$2y$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
| | | |
| | | hash-value = K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
| | |
| | salt = nOUIs5kJ7naTuTFkBy1veu
| |
| cost-factor = 10 = 2^10 iterations
|
hash-algorithm = 2y = BCrypt
La sal que puede encontrar después del tercer $
, es generada automáticamente por password_hash () usando la fuente aleatoria del sistema operativo. Debido a que la sal se incluye en la cadena resultante, la función password_verify (), o en realidad la función crypt ajustada, puede extraerla de allí, y puede calcular un hash con la misma sal (y el mismo factor de costo). Esos dos hash son entonces comparables.
// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);
La sal se almacena como parte del hash.