Det finns några punkter som kan förbättras, men först skulle jag rekommendera att använda PHPs nya funktion password_hash() . Denna funktion kommer att generera ett säkert salt och inkluderar det i det resulterande hash-värdet, så att du kan lagra det i ett enda databasfält. Det finns också ett kompatibilitetspaket för tidigare versioner.
// 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);
Några tankar om din kod:
- Du genererar en BCrypt-hash med crypt(), så saltet kommer att vara en del av den resulterande hashen. Det finns ingen anledning att förvara den separat.
- Genereringen av saltet kan förbättras, använd den slumpmässiga källan för operativsystemet MCRYPT_DEV_URANDOM.
- Om du skulle ändra kostnadsfaktorn till 9 skulle formatet bli ogiltigt, eftersom krypten förväntar sig två siffror.