Position actuelle: Accueil> Derniers articles> Est-il acceptable d'utiliser crypt () avec mot de passe_verify ()?

Est-il acceptable d'utiliser crypt () avec mot de passe_verify ()?

M66 2025-06-06

Lorsque le hachage et la vérification du mot de passe dans PHP, Crypt () et Password_verify () sont deux fonctions fréquemment mentionnées. Bien qu'ils impliquent tous le traitement de la sécurité du mot de passe, ils sont utilisés différemment et conçus à différentes fins. Par conséquent, les développeurs peuvent demander:

1. Présentation de la fonction crypte ()

Crypt () est une fonction utilisée en PHP pour chiffrer les mots de passe au début. Il prend en charge une variété d'algorithmes, tels que:

  • DES (par défaut)

  • MD5 (à commencer par 1 $ )

  • Blowfish (commencez avec 2A $ , 2 $ $ , etc.)

  • SHA-256, SHA-512 (à partir de 5 $ , 6 $ )

Une utilisation typique de crypte () est la suivante:

 $password = 'mySecret';
$salt = '$2y$10$' . substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22);
$hash = crypt($password, $salt);

2. Le principe de Password_verify ()

Password_verify () est une fonction introduite dans PHP 5.5 et est conçue spécifiquement pour valider les hachages générés à l'aide de mot de passe_hash () . Il identifie automatiquement l'algorithme utilisé par le hachage (comme Bcrypt, Argon2) et le compare en fonction du mot de passe en texte en clair entré.

 if (password_verify('mySecret', $hashFromDatabase)) {
    echo 'Mot de passe correct';
}

3. Peut - on utiliser en combinaison?

Réponse courte: non recommandée, et cela n'a pas de sens.

Bien que Password_verify () appelle en effet le mécanisme sous-jacent similaire à Crypt () , il ne prend en charge que le format de hachage généré par sa fonction "ménage" password_hash () . Si vous utilisez Crypt () pour personnaliser le hachage, puis utiliser Password_verify () pour vérifier, les problèmes suivants se produiront:

  • Si le format de hachage ne répond pas aux attentes de Password_verify () , il renverra faux;

  • PHP ne garantit pas la prise en charge des hachages de format non standard générés par Crypt () dans les versions futures;

  • Password_verify () peut ne pas être analysé du tout pour le hachage du mauvais format, ce qui entraîne toujours une vérification.

En d'autres termes, bien que les deux soient liés, ce ne sont pas des paires fonctionnelles conçues pour être interopérables.

4. Comparaison de sécurité

Risques d'utilisation de crypte () :

  • Gérer manuellement les valeurs de sel et la sélection des algorithmes, qui est sujette aux erreurs;

  • S'il est mal utilisé (comme utiliser l'algorithme DES par défaut ou une valeur de sel faible), vous êtes sujet à la fissuration par force brute;

  • Il n'y a pas de mécanisme pour l'algorithme de mise à jour automatique;

  • La compatibilité future ne peut être garantie.

Avantages de l'utilisation de mot de passe_hash () et de mot de passe_verify () :

  • Sélectionnez automatiquement les algorithmes par défaut de sécurité (tels que BCrypt);

  • Générer automatiquement les valeurs de sel;

  • L'algorithme est bien encapsulé et les développeurs n'ont pas besoin de se soucier de la mise en œuvre sous-jacente;

  • L'algorithme de lissage peut être mis à niveau via Password_Needs_Hehash () ;

  • La sécurité est examinée par des normes modernes.

5. Pratiques recommandées

Pour une meilleure sécurité et une meilleure compatibilité, il est recommandé d'utiliser toujours Password_Hash () avec Password_verify () :

 // Lors de l'enregistrement ou de la modification du mot de passe
$hash = password_hash('mySecret', PASSWORD_DEFAULT);

// Vérifiez à la connexion
if (password_verify('mySecret', $hash)) {
    // La vérification est réussie
}

Si vous utilisez Crypt () dans votre ancien système, il est recommandé d'utiliser Password_Hash () pour régénérer le hachage après le succès de la connexion de l'utilisateur et de mettre à jour la valeur de la base de données. Cette approche peut progressivement passer à une méthode de chiffrement plus sécurisée.

6. Conclusion

Bien que Crypt () soit un vétéran de PHP, il a progressivement été remplacé par le mot de passe plus moderne et sécurisé_hash () et le mot de passe_verify () dans le domaine du traitement de mot de passe. L'utilisation de crypte () et de mot de passe_verify () en combinaison n'apportera pas l'amélioration attendue de la sécurité, mais peut entraîner une défaillance de vérification et d'autres problèmes dus à l'incompatibilité. Par conséquent, la meilleure pratique consiste à adopter pleinement la fonction Password_series fournie par PHP pour gérer le mot de passe de l'utilisateur * pour assurer la sécurité et la maintenabilité du système.

Pour d'autres mesures de sécurité, vous pouvez utiliser l'algorithme Argon2 en combinaison: