Position actuelle: Accueil> Derniers articles> Différences de comportement de la crypte () à travers les versions de PHP

Différences de comportement de la crypte () à travers les versions de PHP

M66 2025-05-22

La fonction crypte () dans PHP est une fonction centrale pour chiffrer les chaînes (généralement les mots de passe). Il est basé sur l'algorithme de chiffrement sous-jacent du système et hachent la chaîne d'entrée pour obtenir un stockage et une vérification sécurisés des mots de passe. Bien que l'utilisation et l'objectif de base de la fonction crypt () soient cohérents entre les versions PHP, il existe des différences importantes dans son implémentation interne et ses algorithmes pris en charge à mesure que les versions PHP et Système d'exploitation changent. Ces différences affectent directement la sécurité du mot de passe et la compatibilité des applications, et les comprendre est essentielle pour développer des applications sécurisées et stables.

1. Examen de l'utilisation de base de la fonction crypte ()

crypt () accepte deux paramètres:

 $hashed_password = crypt($password, $salt);
  • $ mot de passe est un mot de passe en texte clair ou n'importe quelle chaîne;

  • $ Le sel est utilisé pour contrôler la valeur de sel de l'algorithme de chiffrement. Différents formats déterminent le choix de l'algorithme de chiffrement.

La valeur de retour est une chaîne qui a été cryptée. Lors de la vérification du mot de passe, le même sel sera utilisé pour réincurpoter le mot de passe pour comparer si les résultats sont cohérents.

2. Les différences de comportement de crypte () dans différentes versions PHP

1. La plage de support des algorithmes de chiffrement est différente

  • Versions PHP précoces (PHP 4.x, PHP 5.2 et avant)

    • Seul le cryptage DES standard fourni par le système (basé sur des clés 56 bits, le sel est de 2 caractères), avec une faible sécurité.

    • Si le format de sel fourni est incorrect, crypt () dégénérera en utilisant le cryptage DES.

  • PHP 5,3 et au-delà

    • Commencez à prendre en charge des algorithmes de chiffrement plus modernes tels que MD5 (le format de sel commence par 1 $ ),

    • Blowfish est également pris en charge (le format de sel commence par 2A $ ou 2 $ $ $ , selon la version PHP),

    • Des algorithmes tels que SHA-256 ( 5 $ ) et SHA-512 ( 6 $ ) sont prévus que la bibliothèque LIBC du système d'exploitation prend en charge.

  • Php 7.x

    • Continuez à améliorer le support de Blowfish et à fixer certaines vulnérabilités de sécurité dans l'histoire (comme l'impact de 2A $ )

    • PHP 7.3 a introduit plus tard le tag $ $ $ $ , une version plus sûre de Blowfish.

    • La prise en charge de différents systèmes est plus élevée et plus d'algorithmes sont pris en charge.

  • Php 8.x

    • Maintenez le soutien des algorithmes ci-dessus et faites attention à la sécurité et à la compatibilité.

    • Il est recommandé d'utiliser les fonctions de hachage de mot de passe natif de PHP Mord_Hash () et Password_verify () , mais crypt () est toujours disponible.

2. L'impact de différents systèmes d'exploitation sur le support crypte ()

La fonction crypt () repose en fait sur la bibliothèque LIBC du système d'exploitation (comme GNU LIBC, BSD LIBC) pour terminer l'opération de chiffrement, donc:

  • Les algorithmes pris en charge peuvent ne pas être complètement cohérents pour la même version PHP sur différents systèmes d'exploitation (Linux, FreeBSD, Windows).

  • La prise en charge Crypt () sur Windows est très limitée et ne prend généralement en charge que le cryptage DES traditionnel.

  • Linux prend généralement en charge plusieurs algorithmes, selon la version LIBC.

Iii. L'impact de ces différences sur l'application

1. Sécurité de mot de passe

Il existe une énorme lacune dans la sécurité entre différents algorithmes de chiffrement. Les premiers algorithmes de chiffrement DES ont été facilement fissurés et ne devraient plus être utilisés dans les environnements de production. Les versions et systèmes d'exploitation PHP qui prennent en charge les algorithmes modernes (comme Blowfish, SHA-512) peuvent considérablement améliorer la sécurité du stockage de mot de passe.

2. Compatibilité du code et portabilité

  • Si l'application dépend de crypte () et ne spécifie pas explicitement le format de sel, une défaillance de vérification du mot de passe peut se produire lors de la mise à niveau de la version PHP ou de la migration du système d'exploitation.

  • Par exemple, l'ancien système n'est crypté qu'avec DES et devient SHA-512 après la migration, ce qui entraîne un nouveau système incapable de vérifier correctement l'ancien mot de passe.

  • Par conséquent, il est recommandé de spécifier explicitement le format de sel dans l'application ou d'adopter une interface de traitement de mot de passe plus moderne.

3. Alternatives recommandées

PHP OFFICIEL a introduit Password_Hash () et Password_verify () dans la version 5.5, encapsulant les détails du chiffrement et de la vérification du mot de passe:

 $hash = password_hash($password, PASSWORD_DEFAULT);  // Utilisé par défaut bcrypt
if (password_verify($password, $hash)) {
    echo "La vérification du mot de passe a réussi";
}
  • Cette interface a une bonne compatibilité et une bonne sécurité, et peut automatiquement sélectionner l'algorithme le plus sûr.

  • Évitez directement les problèmes de complexité et de compatibilité de l'utilisation de crypte () .

  • Dans les versions futures, cette solution est recommandée au lieu d'appeler directement Crypt () .

4. Exemple de démonstration de code

L'exemple suivant montre comment appeler crypt () avec différents sels et illustre les différences de résultats de cryptage: