Dans PHP, la fonction crypte () est souvent utilisée pour crypter les mots de passe. Il peut prendre en charge une variété d'algorithmes de hachage, tels que Standard DES, MD5, SHA-256 et SHA-512, et son comportement dépend de la "valeur de sel" entrante. La valeur de sel augmente non seulement la complexité du mot de passe, mais détermine également la méthode et le résultat du hachage. Une fois que la valeur de sel est incorrecte, même si l'utilisateur entre le mot de passe d'origine correct, il ne peut pas transmettre la vérification.
La syntaxe de base de crypte () est la suivante:
$hashed_password = crypt('Mot de passe d'origine', 'Valeur de sel');
Pendant la vérification, le mot de passe entré par l'utilisateur est généralement réincarré à l'aide du hachage précédemment stocké comme valeur de sel:
if (crypt($input_password, $stored_hash) === $stored_hash) {
// Mot de passe correct
}
Notez que le point clé ici est: le hachage lui-même est passé dans le cadre de la valeur de sel pour garantir que l'utilisation d'algorithmes et de valeurs de sel complètement cohérents.
Il existe deux fonctions principales de valeur de sel:
Empêchez l'attaque de la table arc-en-ciel: même si deux utilisateurs utilisent le même mot de passe, leurs résultats de hachage seront différents après avoir ajouté différentes valeurs de sel.
Dites Crypt () quel algorithme de chiffrement et ses paramètres à utiliser.
Par exemple, la valeur de sel suivante spécifie l'utilisation de l'algorithme SHA-512 et d'itération 5000 fois:
$salt = '$6$rounds=5000$usesomesillystringforsalt$';
Si vous essayez de réincrirner le même mot de passe avec différentes valeurs de sel (même si une seule est différente), les résultats seront complètement différents. C'est exactement la caractéristique de la fonction de hachage: un léger changement entraînera une énorme différence dans les résultats de sortie .
Imaginez un scénario:
$original_hash = crypt('mySecretPassword', '$6$rounds=5000$m66.net$');
Lorsque l'utilisateur se connecte à nouveau, le programme vérifie comme suit:
if (crypt('mySecretPassword', '$6$rounds=5000$wrongdomain.com$') === $original_hash) {
echo 'Mot de passe correct';
} else {
echo 'Mot de passe d'erreur';
}
Bien que l'utilisateur ait saisi le mot de passe correct, Crypt () générera un hachage complètement différent en raison de différentes valeurs de sel, provoquant l'échec de la vérification.
C'est comme si vous utilisiez la même recette (mot de passe), mais en utilisant différents ingrédients (sel), le plat (hachage) qui finit par fabriquer est naturellement différent.
Mauvaise pratique:
Générez une nouvelle valeur de sel aléatoire à chaque fois que vous le vérifiez.
La valeur de hachage d'origine n'est pas utilisée comme valeur de sel pendant la vérification.
Tronquer ou modifier manuellement les valeurs de hachage stockées.
Façon correcte de le faire:
En utilisant des API de haut niveau telles que Password_Hash () et Password_verify () , ils gèrent automatiquement les valeurs de sel et les algorithmes.
Si vous utilisez Crypt () , le hachage d'origine est toujours utilisé comme valeur de sel lors de la validation.