Position actuelle: Accueil> Derniers articles> Pourquoi est-ce que je renvoie toujours le même résultat de chiffrement lorsque je crypte le même contenu avec la fonction crypte ()?

Pourquoi est-ce que je renvoie toujours le même résultat de chiffrement lorsque je crypte le même contenu avec la fonction crypte ()?

M66 2025-06-15

Dans PHP, Crypt () est une fonction du chiffrement de hachage, qui est largement utilisé dans les scénarios de traitement des mots de passe et de chiffrement des données. Cependant, de nombreux développeurs sont surpris de constater que lors du chiffrement du même contenu en utilisant la fonction crypte () :

Cet article vous emmènera dans une compréhension approfondie des raisons de ce phénomène et vous apprendra à utiliser Crypt () correctement et en toute sécurité.

1. Comprendre les principes de base de la fonction crypte ()

L'essence de Crypt () est une fonction de hachage, qui ne concerne pas les données, mais pour générer des valeurs de hachage irréversibles, qui sont souvent utilisées pour la vérification du mot de passe.

Le prototype de fonction est le suivant:

 string crypt(string $string, string $salt)

Il reçoit deux paramètres:

  • $ String : La chaîne à crypter.

  • $ sel : la "valeur de sel" utilisée pendant le cryptage, utilisée pour affecter le résultat de hachage.

Si vous passez le même Salt $ , crypter la même chaîne $ obtiendra naturellement le même résultat. C'est exactement pourquoi vous voyez que "les résultats de cryptage sont toujours les mêmes."

2. Pourquoi le résultat est-il toujours le même?

En effet, lorsque vous appelez crypt () , vous pouvez avoir utilisé une valeur de sel fixe, ou simplement passer le deuxième paramètre $ sel .

Le Crypt () de PHP tente d'utiliser certains mécanismes par défaut du système lorsqu'aucun sel n'est fourni, mais ce mécanisme peut apparaître comme "en utilisant le même sel par défaut" sur certains systèmes, ce qui entraîne "la même entrée obtient toujours la même sortie".

Jetez un œil à l'exemple suivant:

 echo crypt("mypassword", "m6"); // Utiliser fixe salt

Chaque fois que j'exécute ce code, la sortie sera la même, peu importe le nombre de fois. Cela signifie que si un attaquant sait que vous utilisez un sel fixe, il peut également pré-calculer la table de hachage pour attaquer votre système.

3. Comment rendre les résultats différents à chaque fois?

** La bonne manière est: utiliser des valeurs de sel aléatoires. ** Chaque fois qu'un hachage de mot de passe est généré pour l'utilisateur, un sel séparé est généré et stocké dans la base de données. De cette façon, même si les mots de passe de deux utilisateurs sont les mêmes, leurs valeurs de hachage seront différentes.

PHP recommande d'utiliser une méthode avec une génération automatique de sel, comme l'utilisation de la fonction Password_Hash () , qui est une manière plus sûre introduite à partir de PHP 5.5+:

 $password = 'mypassword';
$hash = password_hash($password, PASSWORD_BCRYPT);

Cette fonction générera automatiquement un sel unique pour vous et le fixera au résultat. Chaque exécution obtiendra des résultats différents:

 // Chaque sortie est différente
$hash1 = password_hash('mypassword', PASSWORD_BCRYPT);
$hash2 = password_hash('mypassword', PASSWORD_BCRYPT);

Mais ils peuvent toujours être utilisés pour vérifier le mot de passe d'origine via Password_verify () .

4. Que dois-je faire si je n'utilise pas Crypt () ?

Si vous devez utiliser Crypt () , générez un sel aléatoire manuellement. Voici un exemple:

 function generate_salt($length = 22) {
    return substr(strtr(base64_encode(random_bytes($length)), '+', '.'), 0, $length);
}

$password = 'mypassword';
$salt = '$2y$10$' . generate_salt(); // utiliser Blowfish algorithme
$hash = crypt($password, $salt);

Chaque appel générera un sel différent et des résultats de chiffrement naturellement différents seront générés.

5. Stockage et vérification

Les résultats cryptés doivent être stockés dans la base de données pour une vérification ultérieure. L'exemple de code est le suivant:

 // Lorsque le stockage
$hash = crypt($password, $salt);
// Enregistrer dans la base de données

// Pendant la vérification
if (hash_equals($hash, crypt($inputPassword, $hash))) {
    echo "Mot de passe correct";
} else {
    echo "Mot de passe d'erreur";
}

Notez que le deuxième paramètre de crypte () peut être transmis directement dans la valeur de hachage cryptée, et PHP en extrait automatiquement le sel.

6. Résumé

  • Crypt () renvoie le même résultat car vous avez utilisé le même sel.

  • Pour être en sécurité, vous devez utiliser le sel aléatoire ou utiliser directement Password_Hash () .

  • Il n'est pas recommandé de continuer à utiliser Crypt () dans de nouveaux projets, sauf s'il existe une exigence spéciale.

  • Évitez toujours les sels à code dur pour éviter les attaques de table arc-en-ciel.

Lors du développement d'un système impliquant le traitement du mot de passe utilisateur, la sécurité est toujours la priorité absolue. La compréhension correcte du comportement de crypte () vous aidera à créer un système d'application plus stable et plus fiable.