Password verify php

Lors du développement d’applications web sécurisées, la vérification des mots de passe constitue une étape critique que tout programmeur PHP doit maîtriser parfaitement. Si la fonction password_hash() génère des empreintes cryptographiques robustes lors de l’inscription des utilisateurs, c’est password_verify() qui entre en jeu au moment de la connexion. Cette fonction moderne simplifie la validation tout en bloquant les attaques sophistiquées comme les fuites de timing.

Signature de la fonction password verify PHP

La fonction password_verify() présente une signature d’une simplicité remarquable : 

password_verify(string $motdepasse, string $hash)

Elle accepte exactement deux paramètres et retourne un booléen clair : true en cas de correspondance, false sinon.

  • $motdepasse, correspond au mot de passe saisi en clair par l’utilisateur dans le formulaire de connexion.
  • $hash, provient directement de votre base de données – il s’agit du résultat stocké lors de l’inscription via password_hash(). Cette approche évite toute manipulation manuelle des sels ou des algorithmes, car password_verify() analyse automatiquement la structure du hash fourni.

Cette fonction se distingue par sa comparaison à temps constant, une protection essentielle contre les attaques par timing qui mesurent les micro-différences de temps de calcul pour deviner les mots de passe caractère par caractère. Voici un exemple d’utilisation basique dans un scénario d’authentification :

<?php
// Hash récupéré de la base de données lors de la connexion
$hashStocke = '$2y$10$exempleDeHashAvecSaltInclusLongueur60';

// Mot de passe saisi par l'utilisateur
$motdepasseSaisi = 'MonMotDePasseTresSecure2024!';

if (password_verify($motdepasseSaisi, $hashStocke)) {
    echo "Authentification réussie ! L'utilisateur peut accéder à son compte.";
    // Démarrer la session, rediriger vers le tableau de bord
} else {
    echo "Mot de passe incorrect. Veuillez réessayer.";
    // Afficher un message d'erreur sans détails techniques
}
?>

Ce code illustre parfaitement comment password_verify() gère toute la complexité en coulisses : extraction du sel, application du bon algorithme, et vérification sécurisée sans jamais exposer d’informations sensibles.

Exemples pratiques avec tous les algorithmes supportés

PHP supporte plusieurs algorithmes via son API de hachage de mots de passe, et password_verify() les traite tous de manière transparente. Chaque hash contient des métadonnées qui indiquent à la fonction comment procéder. Examinons des exemples concrets pour chaque option.

PASSWORD_DEFAULT : L’algorithme évolutif par défaut

L’algorithme PASSWORD_DEFAULT représente le choix le plus sûr pour les nouveaux projets, car il suit les évolutions de PHP. Actuellement basé sur bcrypt, il pourrait passer à Argon2 dans les versions futures sans nécessiter de modifications de code.

Pour générer un hash avec cet algorithme lors de l’inscription :

<?php
$motdepasse = 'MonMotDePasseTresSecure2024!';
$nouveauHash = password_hash($motdepasse, PASSWORD_DEFAULT, ['cost' => 12]);
echo $nouveauHash; 
// Exemple : $2y$12$unHashTresLongAvecSaltEtAlgoInclus
?>

Puis, lors de la connexion, password_verify() valide instantanément :

<?php
$hashStocke = '$2y$12$unHashTresLongAvecSaltEtAlgoInclus';

if (password_verify('MonMotDePasseTresSecure2024!', $hashStocke)) {
    echo "Connexion validée avec PASSWORD_DEFAULT. Sécurité optimale assurée.";
}
?>

Cette flexibilité garantit que votre application reste protégée au fil des mises à jour de PHP.

PASSWORD_BCRYPT : Le standard éprouvé

Bcrypt, accessible via PASSWORD_BCRYPT, domine depuis des années grâce à sa robustesse et sa compatibilité universelle. Les hachages produits font exactement 60 caractères et commencent par $2y$$2x$ ou $2a$.

Exemple complet de génération et vérification :

<?php
// Phase inscription avec cost élevé pour plus de sécurité
$options = ['cost' => 14];
$hashBcrypt = password_hash('MonMotDePasseTresSecure2024!', PASSWORD_BCRYPT, $options);

echo "Hash généré : " . $hashBcrypt . "\n";

// Phase connexion - détection automatique du cost 14
if (password_verify('MonMotDePasseTresSecure2024!', $hashBcrypt)) {
    echo "Bcrypt validé ! Le cost élevé ralentit efficacement les attaques.";
}
?>

La fonction adapte son calcul au cost détecté dans le hash, maintenant ainsi un niveau de protection cohérent.

PASSWORD_ARGON2I : Résistance aux attaques mémoire

Réservé aux environnements PHP compilés avec libsodium, PASSWORD_ARGON2I excelle contre les attaques exploitant les faiblesses temporelles. Il consomme beaucoup de mémoire, ce qui complique les calculs parallèles sur GPU.

<?php
// Génération avec paramètres mémoire-intensive
$optionsArgon2i = [
    'memory_cost' => 65536,  // 64 Mo de RAM requise
    'time_cost'   => 4,      // 4 itérations
    'threads'     => 2       // Utilisation multi-cœurs
];
$hashArgon2i = password_hash('MonMotDePasseTresSecure2024!', PASSWORD_ARGON2I, $optionsArgon2i);

// Vérification automatique des paramètres
if (password_verify('MonMotDePasseTresSecure2024!', $hashArgon2i)) {
    echo "Argon2i confirmé ! Protection anti-GPU activée.";
}
?>

PASSWORD_ARGON2ID : L’hybride moderne recommandé

PASSWORD_ARGON2ID combine les forces d’Argon2i et Argon2d, offrant l’équilibre parfait pour les nouvelles applications. Disponible depuis PHP 7.3, il représente le nec plus ultra en 2026.

<?php
$optionsArgon2id = [
    'memory_cost' => 131072, // 128 Ko (léger mais efficace)
    'time_cost'   => 3,
    'threads'     => 2
];
$hashArgon2id = password_hash('MonMotDePasseTresSecure2024!', PASSWORD_ARGON2ID, $optionsArgon2id);

if (password_verify('MonMotDePasseTresSecure2024!', $hashArgon2id)) {
    echo "Argon2id : l'avenir de la sécurité des mots de passe en PHP.";
}
?>

Script de test multi-algorithmes

Pour valider tous les algorithmes d’un coup dans votre environnement de développement :

<?php
$motdepasseTest = 'MonMotDePasseTresSecure2024!';
$algorithmes = [
    PASSWORD_DEFAULT => 'Défaut (bcrypt)',
    PASSWORD_BCRYPT => 'Bcrypt pur',
    PASSWORD_ARGON2ID => 'Argon2id moderne'
];

foreach ($algorithmes as $algo => $nom) {
    $hash = password_hash($motdepasseTest, $algo, ['cost' => 12]);
    $resultat = password_verify($motdepasseTest, $hash) ? '✓ PASS' : '✗ FAIL';
    
    $infos = password_get_info($hash);
    echo $nom . ' (' . $infos['algoName'] . ') : ' . $resultat . "\n";
}
?>

Ce script confirme que password_verify() s’adapte parfaitement à chaque format de hash rencontré.

En intégrant password_verify() dans vos processus d’authentification, vous bénéficiez d’une sécurité professionnelle sans complexité superflue. Testez dès maintenant ces exemples pour protéger durablement vos utilisateurs !

Sources: php.net

Cours

Variables et types

Manipulation de chaînes

Tableaux

Fichiers et système

Sécurité, session et cookie