Position actuelle: Accueil> Derniers articles> Pourquoi le résultat de crypte () diffère-t-il sur Windows et Linux?

Pourquoi le résultat de crypte () diffère-t-il sur Windows et Linux?

M66 2025-05-31

En PHP, la fonction crypte () est utilisée pour crypter les chaînes dans un hachage à sens unique, qui est souvent utilisé pour stocker et vérifier les mots de passe. Bien que son utilisation soit à peu près la même sur différentes plates-formes, les résultats renvoyés par Crypt () sont souvent différents sur différents systèmes d'exploitation, en particulier Windows et Linux. Cette différence confond de nombreux développeurs. Cet article analysera les raisons en profondeur et donnera des solutions.

1. Introduction au principe de travail de la fonction crypte ()

Crypt () est une fonction d'interface, et l'implémentation sous-jacente dépend de l'algorithme de chiffrement fourni par le système d'exploitation. Il prend généralement en charge une variété d'algorithmes de chiffrement, notamment DES, MD5, SHA-256, SHA-512, etc. Le support spécifique dépend du système d'exploitation et de la version PHP.

Exemple de format d'appel:

 $hash = crypt('mypassword', '$6$rounds=5000$usesomesillystringforsalt$');

Le deuxième paramètre ici est le sel, qui détermine l'algorithme de cryptage et la résistance du cryptage.

2. Causes de la différence entre Windows et Linux

2.1 La bibliothèque de chiffrement dont dépend le système est différente

  • Linux utilise généralement une implémentation crypt () basée sur GLIBC (bibliothèque GNU C), prenant en charge une variété d'algorithmes de hachage modernes (tels que SHA-256, SHA-512, etc.).

  • Windows n'a pas d'implémentation Crypt () intégrée. PHP utilisera une implémentation relativement basique sur Windows, qui ne prend généralement en charge que les algorithmes traditionnels DES ou MD5, et propose des méthodes de chiffrement relativement limitées.

Il en résulte que le hachage correspondant est généré correctement lorsque vous utilisez des paramètres de sel SHA-512 sur Linux, tandis que Windows peut ne pas reconnaître ce format de sel, et le résultat de retour sera différent.

2.2 Version PHP et impact de configuration

Différentes versions PHP peuvent optimiser et compléter le support de crypte () , mais la couche sous-jacente dépend toujours de la bibliothèque système. PHP sous Windows ne peut généralement s'appuyer que sur des implémentations internes, donc ses performances ne sont pas aussi complètes que Linux.

2.3 Format de compatibilité du sel (sel)

Linux prend en charge des formats de sel plus riches, tels que:

  • 1 $ signifie md5

  • 5 $ signifie SHA-256

  • 6 $ Signifie SHA-512

Les fenêtres peuvent ne reconnaître que des formats simples tels que 1 $ $ , et les formats complexes seront ignorés, ce qui entraînera différents résultats de hachage.

3. Comment assurer la cohérence multiplateforme?

3.1 Utilisation de PHP Motways_hash () et de mot de passe_verify de PHP ()

PHP 5.5 a introduit plus tard une interface de hachage de mot de passe plus moderne et unifié:

 $hash = password_hash('mypassword', PASSWORD_DEFAULT);
if (password_verify('mypassword', $hash)) {
    echo "La vérification du mot de passe a réussi";
}

Il encapsule en interne les implémentations compatibles multiplateformes, évitant le problème du comportement incohérent de Crypt () sur différents systèmes.

3.2 Évitez la construction manuelle de sels complexes

Essayez d'utiliser des interfaces standard pour générer du sel au lieu de l'épissage manuel. Le réglage manuel du sel peut entraîner des risques de compatibilité et de sécurité.

3.3 Effectuer des tests adéquats dans un environnement multi-plate-forme

Si vous devez utiliser Crypt () , assurez-vous d'effectuer des tests sur le système cible pour éviter la défaillance de la vérification en raison des différences d'algorithme de hachage.

4. Exemple pratique: rédaction recommandée du hachage de mot de passe multiplateforme

 <?php
// Utilisation recommandée password_hash Alternative crypt
$password = 'mypassword';
$hash = password_hash($password, PASSWORD_DEFAULT);

echo "Résultat du hachage:" . $hash . PHP_EOL;

// Vérifier le mot de passe
if (password_verify($password, $hash)) {
    echo "La vérification du mot de passe a réussi";
} else {
    echo "La vérification du mot de passe a échoué";
}
?>

Cette méthode garantit des performances cohérentes dans les environnements Windows et Linux et utilise un algorithme de hachage sécurisé.