Existem alguns pontos que podem ser melhorados, mas primeiro eu recomendaria usar a nova função do PHP senha_hash() . Essa função gerará um sal seguro e o incluirá no valor de hash resultante, para que você possa armazená-lo em um único campo de banco de dados. Existe também um pacote de compatibilidade para versões anteriores.
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);
// 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);
Algumas considerações sobre seu código:
- Você gera um hash BCrypt com crypt(), então o sal fará parte do hash resultante. Não há necessidade de armazená-lo separadamente.
- A geração do salt pode ser melhorada, use a fonte aleatória do sistema operacional MCRYPT_DEV_URANDOM.
- Se você alterar o fator de custo para 9, o formato se tornará inválido, porque crypt espera dois dígitos.