Position actuelle: Accueil> Derniers articles> Comment utiliser correctement la fonction Crypt () de PHP pour éviter les attaques de table arc-en-ciel?

Comment utiliser correctement la fonction Crypt () de PHP pour éviter les attaques de table arc-en-ciel?

M66 2025-07-10

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.

1. Introduction à la fonction crypte ()

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.

2. Pourquoi crypt () peut-il prévenir les attaques de table arc-en-ciel?

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.

3. Comment utiliser crypte () lors de la vérification du mot de passe

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.

4. Pratiques et pièges non recommandés

Utiliser des valeurs de sel fixe

 $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.

Utilisez d'anciens algorithmes (comme DES)

 $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.

5. Autres suggestions

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.

6. Exemple: Processus d'enregistrement et de connexion complet

 // 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.

Conclusion

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.