Dans le développement d'applications Web moderne, le stockage sécurisé des mots de passe utilisateur est crucial. PHP fournit une variété de méthodes de cryptage de mot de passe, parmi lesquelles la fonction crypt () est un outil de cryptage flexible et puissant. Cet article présentera comment crypter et vérifier en toute sécurité les mots de passe utilisateur à l'aide de la fonction crypte () de PHP, et expliquer comment éviter les pièges de sécurité courants.
Crypt () est une fonction de hachage de mot de passe qui prend en charge plusieurs algorithmes de chiffrement. L'algorithme spécifique dépend du "sel" que vous transmettez. Différents algorithmes ont des formats de sel différents, tels que le SHA-256 , le SHA-512 , etc. L'utilisation raisonnable de crypte () peut générer des hachages de mot de passe solides et augmenter la difficulté de fissuration.
string crypt(string $password, string $salt);
$ mot de passe est le mot de passe en clair entré par l'utilisateur.
$ sel est utilisé pour spécifier l'algorithme de chiffrement et la valeur de sel aléatoire pour s'assurer que les résultats de chaque cryptage sont différents.
La fonction du sel est d'empêcher les attaques de table arc-en-ciel, et chaque mot de passe doit avoir une valeur de sel unique. Pour les algorithmes modernes, le sel doit contenir l'identification des algorithmes, le nombre d'itérations et les caractères aléatoires.
L'exemple suivant génère un sel basé sur l'algorithme SHA-512:
function generateSalt($length = 16) {
$randomBytes = random_bytes($length);
return '$6$rounds=5000$' . substr(strtr(base64_encode($randomBytes), '+', '.'), 0, 16) . '$';
}
6 $ Signifie l'utilisation de SHA-512.
Rounds = 5000 contrôle le nombre d'itérations de hachage, plus elle est plus sûre, mais elle prend du temps.
Les cordes aléatoires assurent le caractère unique du sel.
En combinant le sel généré ci-dessus, vous pouvez crypter le mot de passe comme ceci:
$password = 'user_password_here';
$salt = generateSalt();
$hash = crypt($password, $salt);
$ hash est la chaîne de hachage de mot de passe stockée dans la base de données.
Pendant la vérification, vous ne pouvez pas comparer directement le mot de passe et le hachage, mais appelez Crypt () avec le mot de passe d'entrée de l'utilisateur et passer le hachage stocké comme sel. La fonction extraire automatiquement le sel et cryptera le mot de passe:
function verifyPassword($inputPassword, $storedHash) {
$hash = crypt($inputPassword, $storedHash);
return hash_equals($hash, $storedHash);
}
Utilisez hash_equals () pour éviter les attaques de synchronisation et assurer une relativement sûre.
<?php
// Générer une fonction de sel
function generateSalt($length = 16) {
$randomBytes = random_bytes($length);
return '$6$rounds=5000$' . substr(strtr(base64_encode($randomBytes), '+', '.'), 0, 16) . '$';
}
// Mot de passe crypté lors de l'enregistrement
function encryptPassword($password) {
$salt = generateSalt();
return crypt($password, $salt);
}
// Vérifiez le mot de passe lors de la connexion
function verifyPassword($inputPassword, $storedHash) {
$hash = crypt($inputPassword, $storedHash);
return hash_equals($hash, $storedHash);
}
// Exemple
$userPassword = 'MySecurePass123';
$storedHash = encryptPassword($userPassword);
echo "Hachage crypté: " . $storedHash . "\n";
$inputPassword = 'MySecurePass123';
if (verifyPassword($inputPassword, $storedHash)) {
echo "La vérification du mot de passe a réussi!";
} else {
echo "Mot de passe d'erreur!";
}
?>
Essayez d'utiliser Password_Hash () et Password_verify () de PHP 7.2+ , qui résument les algorithmes plus modernes et sécurisés, mais si vous devez utiliser Crypt () pour des raisons spéciales, veuillez vous référer à la méthode ci-dessus.
Mettez régulièrement à jour la stratégie de hachage du mot de passe pour augmenter le nombre d'itérations.
La chaîne de hachage stockée dans la base de données contient des informations sur le sel et l'algorithme, et il n'est pas nécessaire de stocker le sel séparément.