Hay algunos puntos que se pueden mejorar, pero primero recomendaría usar la nueva función de PHP contraseña_hash() . Esta función generará una sal segura y la incluirá en el valor hash resultante, para que pueda almacenarla en un solo campo de base de datos. También existe un paquete de compatibilidad para versiones 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);
Algunas reflexiones sobre su código:
- Usted genera un hash BCrypt con crypt(), por lo que la sal será parte del hash resultante. No es necesario almacenarlo por separado.
- La generación de la sal se puede mejorar, use la fuente aleatoria del sistema operativo MCRYPT_DEV_URANDOM.
- Si cambiara el factor de costo a 9, el formato dejaría de ser válido, porque crypt espera dos dígitos.