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.
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.
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.
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.
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.
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.
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é.
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.
<?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é.