Dans le développement Web moderne, le stockage sécurisé des mots de passe utilisateur est une tâche critique. L'attaque de la table arc-en-ciel est une technique de fissure de mot de passe courante qui s'appuie sur des tables de hachage pré-calculées pour correspondre rapidement aux mots de passe d'origine. Pour nous défendre efficacement contre cette attaque, nous devons ajouter du "sel" au hachage de mot de passe. La fonction crypte () de PHP est un outil qui peut bien gérer ce défi, mais seulement s'il est utilisé correctement.
La fonction Crypt () de PHP est utilisée pour crypter les chaînes à sens unique et est souvent utilisée pour le hachage du mot de passe. Il prend en charge une variété d'algorithmes de chiffrement, y compris le DES traditionnel, MD5 et le Blowfish plus sécurisé ( 2 $ $ ) et SHA-256/512 ( 5 $ / 6 $ ).
Le prototype de fonction est le suivant:
string crypt(string $string, string $salt);
Lorsque $ String est la chaîne d'origine à crypter, $ SALT détermine quel algorithme utiliser et la variante de chiffrement.
L'attaque de la table arc-en-ciel repose sur la pré-calcul des valeurs de hachage. Cependant, si la valeur de sel de chaque hachage est différente, l'attaquant ne peut pas utiliser la table arc-en-ciel commune pour la correspondance. Crypt () nous permet de personnaliser la valeur de sel et combinée avec de forts algorithmes de chiffrement, nous pouvons éviter efficacement cette attaque.
Par exemple, nous pouvons utiliser l'algorithme Blowfish et les valeurs de sel dynamique comme ceci:
$password = 'user-password';
$salt = '$2y$10$' . substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22);
$hash = crypt($password, $salt);
Dans le code ci-dessus:
2 ans 10 $ Signifie l'utilisation de l'algorithme Blowfish, avec un facteur de coût de 10;
Random_Bytes (16) génère des sels aléatoires de haute intensité;
Le substr (..., 0, 22) est coupé en longueur conforme au format de sel Blowfish.
Le hachage $ généré de cette manière est le hachage de mot de passe après avoir ajouté du sel.
Lorsque l'utilisateur se connecte, nous n'avons pas besoin de générer manuellement le sel, mais le transmette directement dans crypt () avec le hachage stocké dans la base de données comme paramètre de sel:
$inputPassword = 'user-input';
$storedHash = '$2y$10$qzWRzYy5q3DvYbEC0KMX4O0PGWlOQxkz7v0QF5OwMqpyG0TzjSAGK'; // De la base de données
if (hash_equals($storedHash, crypt($inputPassword, $storedHash))) {
echo 'Mot de passe correct';
} else {
echo 'Mot de passe d'erreur';
}
De cette façon, Crypt () sera automatiquement réencragé le mot de passe à l'aide du sel et de l'algorithme dans le hachage, puis le comparez. Cette méthode est simple et sûre.
$hash = crypt($password, 'fixedsalt');
Cette méthode est extrêmement vulnérable aux attaques de table arc-en-ciel, car le même mot de passe correspond toujours au même hachage.
$hash = crypt($password, 'ab'); // DES algorithme,Sel trop court
Le DES est non seulement court en sel, mais a également un faible coût de calcul, et le matériel moderne peut facilement se fissurer brute.
Bien que Crypt () soit sûr, PHP recommande d'utiliser Password_Hash () et Password_verify (), une API de hachage de mot de passe plus moderne, à partir de 5.5. Cependant, si vous maintenez un ancien projet ou utilisez toujours Crypt () pour des raisons de compatibilité, assurez-vous de faire ce qui suit:
Utilisez des algorithmes forts (tels que 2 ans $ , 5 $ , 6 $ );
Utilisez toujours des valeurs de sel aléatoires et suffisamment longues;
Ne jamais réutiliser le sel;
Les valeurs de sel doivent être stockées dans le hachage au lieu d'être stockées séparément.
// Lors de l'enregistrement
$password = $_POST['password'];
$salt = '$2y$12$' . substr(strtr(base64_encode(random_bytes(16)), '+', '.'), 0, 22);
$hash = crypt($password, $salt);
// stockage $hash Aller à la base de données
// Lors de la connexion
$inputPassword = $_POST['password'];
$storedHash = getHashFromDatabase(); // Obtenir de la base de données
if (hash_equals($storedHash, crypt($inputPassword, $storedHash))) {
echo 'Connectez-vous avec succès';
} else {
echo 'Mot de passe d'erreur';
}
Vous pouvez accéder à https://m66.net/php-crypt-guide pour obtenir la version en ligne de ce tutoriel avec plus d'exemples.
L'utilisation correcte de la fonction crypte () peut effectivement prévenir les attaques de table arc-en-ciel. La clé consiste à utiliser de forts algorithmes de chiffrement, des valeurs de sel aléatoires et des pratiques de sécurité lors de la comparaison. Bien que le nouveau projet recommande d'utiliser la série de fonctions Password_Hash () , la maîtrise de l'utilisation sûre de Crypt () est également un cours obligatoire pour chaque développeur PHP.