Comment hacher et vérifier les mots de passe en toute sécurité avec la façade Hash de Laravel. Configuration et utilisation des algorithmes bcrypt et Argon2.
Le hachage (hashing) est le processus qui transforme des données en clair, comme un mot de passe, en une chaîne de longueur fixe via une conversion à sens unique.
La même entrée produit toujours le même hachage, mais il est impossible de reconstituer le texte clair à partir d’un hachage.La façade Hash de Laravel prend en charge les algorithmes bcrypt et Argon2 pour stocker les mots de passe en toute sécurité.
Coût de calcul ajustable via le work factor (rounds). Par défaut
Applications web classiques
argon2i
Mémoire, temps et threads ajustables. Résistant aux attaques par canaux auxiliaires
Contextes à haute sécurité
argon2id
Hybride argon2i/argon2d. Recommandé par PHC
Utilisation d’Argon2 dans un nouveau projet
Le « work factor » de bcrypt contrôle le temps de calcul du hachage. Plus le hachage est lent, plus il résiste aux attaques par force brute. À mesure que le matériel s’améliore, augmentez le work factor pour maintenir la sécurité.
L’option rounds ajuste le coût de calcul. Une valeur élevée est plus sûre, mais plus lente.
La valeur par défaut (12) convient à la plupart des applications.
Hash::check() permet de vérifier qu’un mot de passe en clair correspond à un hachage stocké.
Exemple typique lors du processus de connexion.
use Illuminate\Support\Facades\Hash;if (Hash::check($request->password, $user->password)) { // Le mot de passe correspond} else { // Le mot de passe ne correspond pas}
Lors de l’utilisation de Auth::attempt(), cette vérification est automatique et vous n’avez pas besoin de l’appeler directement.
Hash::check() est utile lorsque vous devez vérifier manuellement le mot de passe courant.
// Exemple : vérification du mot de passe actuel dans un formulaire de changementif (! Hash::check($request->current_password, $request->user()->password)) { return back()->withErrors(['current_password' => 'Le mot de passe actuel est incorrect.']);}
Hash::needsRehash() indique si le work factor utilisé lors de la génération du hachage diffère de la configuration actuelle.
Cela sert à mettre à jour les hachages existants après un changement de work factor.
use Illuminate\Support\Facades\Hash;if (Hash::needsRehash($user->password)) { $user->update([ 'password' => Hash::make($plainTextPassword), ]);}
Exemple de re-hachage lors d’une connexion réussie.
// Re-hachage dans le traitement de connexionif (Auth::attempt($credentials)) { if (Hash::needsRehash(Auth::user()->password)) { Auth::user()->update([ 'password' => Hash::make($credentials['password']), ]); } return redirect()->intended('/dashboard');}
Réévaluez régulièrement le work factor pour suivre l’évolution du matériel et maintenir votre niveau de sécurité. Grâce à needsRehash(), vous pouvez profiter des connexions utilisateur pour mettre à jour naturellement les mots de passe.
Par défaut, Hash::check() vérifie que le hachage a été généré avec l’algorithme actuellement configuré.
Si l’algorithme diffère, une RuntimeException est lancée.Cela protège contre des attaques par altération de l’algorithme.Si vous devez prendre en charge plusieurs algorithmes simultanément (migration en cours), vous pouvez désactiver cette vérification en réglant HASH_VERIFY sur false.
# .envHASH_VERIFY=false
Régler HASH_VERIFY=false désactive la vérification d’algorithme. Ne l’utilisez que durant la période de migration et remettez true (valeur par défaut) une fois la migration terminée.