Position actuelle: Accueil> Derniers articles> Password_needs_rehash ne prend pas effet? Il se peut que l'algorithme de hachage soit configuré de manière incorrecte

Password_needs_rehash ne prend pas effet? Il se peut que l'algorithme de hachage soit configuré de manière incorrecte

gitbox 2025-05-28

Dans PHP, la fonction Password_Needs_Hehash est utilisée pour déterminer si une valeur de hachage de mot de passe doit être relogée à l'aide de l'algorithme et des options actuellement spécifiés. Lorsque la politique de hachage du système change (comme la mise à niveau de Bcrypt à Argon2id ou la modification du facteur de coût), il peut nous aider à mettre à niveau tranquillement l'ancien hachage vers la nouvelle norme lorsque l'utilisateur se connecte. Cependant, les développeurs peuvent rencontrer des situations où "semble improductif" lors de l'utilisation de cette fonction. Analyons pourquoi Password_Needs_Hehash peut ne pas prendre effet et nous concentrer sur l'explication de la raison la plus courante: l'erreur de réglage de l'algorithme de hachage.

1. Examen des fonctions de base

 $hash = password_hash('mypassword', PASSWORD_DEFAULT);
$options = ['cost' => 12];

if (password_needs_rehash($hash, PASSWORD_DEFAULT, $options)) {
    $hash = password_hash('mypassword', PASSWORD_DEFAULT, $options);
}

Cette logique signifie: si le hachage d'origine ne se conforme pas à l'algorithme ou aux paramètres actuels, il sera rétabli.

2. Misonnés communs: erreurs de réglage de l'algorithme de hachage

La base principale de Password_Needs_Hehash est l'algorithme et les paramètres que vous transmettez . Si vous définissez ces paramètres de manière incorrecte, il ne parviendra pas à juger la différence , et donc à retourner faux incorrectement, en pensant qu'aucune mise à jour n'est requise.

Exemple 1: pensant à tort que Password_default sera mis à jour automatiquement

De nombreux développeurs pensent que tant que vous utilisez Password_default , PHP mettra automatiquement à jour l'algorithme pour vous. Par exemple:

 $oldHash = password_hash('mypassword', PASSWORD_BCRYPT); // Utiliser explicitement bcrypt

Ensuite, vous le changez en:

 $options = ['cost' => 12];
$needsRehash = password_needs_rehash($oldHash, PASSWORD_DEFAULT, $options);

Le problème est: Password_Default est actuellement (à partir de PHP 8.3) encore Password_Bcrypt , alors Password_Needs_HeHash ne trouve pas l'incohérence de l'algorithme car il estime que l'algorithme est toujours bcrypt. À ce stade, vous pouvez vous attendre à ce qu'il revienne vrai , mais il revient faux .

3. La remise en état ne sera pas déclenchée lorsque les paramètres du coût n'ont pas changé.

Beaucoup de gens passeront des paramètres de coût (tels que le coût ), mais si le même coût est déjà utilisé dans la valeur de hachage d'origine, la fonction ne sera pas jugée comme "remaniement est requis". Même si vous écrivez ['Cost' => 10] manuellement, et qu'il était à l'origine 10, la fonction renvoie false dans ce cas.

 $hash = password_hash('mypassword', PASSWORD_BCRYPT, ['cost' => 10]);
$needsRehash = password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 10]);
// Le résultat est toujours false,Parce qu'il n'y a pas de changement

4. Comment déterminer correctement si les mises à jour sont nécessaires

Pour vous assurer que votre stratégie de hachage est correctement perçue lorsque des changements se produisent, les pratiques suivantes sont recommandées:

  1. Configurez clairement de nouveaux algorithmes (tels que la mise à niveau de Password_Bcrypt à Password_argon2id );

  2. Mettre à jour explicitement les paramètres de coût, tels que l'augmentation du coût de 10 à 12;

  3. Si possible, maintenez la stratégie de hachage d'origine en tant qu'élément de configuration pour les mises à niveau unifiées.

 $hash = password_hash('mypassword', PASSWORD_ARGON2ID);
$needsRehash = password_needs_rehash($hash, PASSWORD_ARGON2ID, [
    'memory_cost' => 1<<17,
    'time_cost' => 4,
    'threads' => 2
]);

V. Suggestions de débogage

Si vous soupçonnez que Password_Needs_Hehash ne fonctionne pas comme prévu, vous pouvez produire la chaîne de hachage pendant le débogage pour vérifier. Les préfixes de hachage représentent généralement l'algorithme utilisé, par exemple:

  • 2 ans $ signifie bcrypt

  • $ argon2id $ signifie argon2id

Vous pouvez vérifier si le nouvel algorithme est réellement utilisé en observant ces préfixes.

De plus, la configuration actuelle peut être sortie via la journalisation, ou une page de gestion d'arrière-plan peut être créée pour vérifier la stratégie de hachage actuellement utilisée.

6. Conclusion

Password_needs_rehash est une fonction très pratique qui peut nous aider à lisser la stratégie de hachage de mot de passe de transition, mais ce n'est pas "magique". Cela dépend des paramètres que vous fournissez pour juger les différences. Si la configuration est fausse, il peut penser qu'aucune mise à jour n'est requise même si le hachage est obsolète. Par conséquent, garder la configuration de la stratégie de hachage claire et contrôlable est la clé pour assurer l'efficacité de la fonction.

S'assurer que votre code détermine correctement quand la nouvelle reprise est nécessaire est la première étape de l'évolution de la sécurité du mot de passe. Pour les projets en ligne, il est recommandé de configurer les politiques de hachage comme centralisées et évaluer régulièrement le plan de mise à niveau pour garantir que les politiques de sécurité ne restent pas dans le passé.