Position actuelle: Accueil> Derniers articles> Pourquoi Password_Needs_Hehash est-il inexact pour déterminer si le mot de passe doit être mis à jour? Analyse et résolution des problèmes de configuration communs

Pourquoi Password_Needs_Hehash est-il inexact pour déterminer si le mot de passe doit être mis à jour? Analyse et résolution des problèmes de configuration communs

gitbox 2025-08-05

1. Comment fonctionne Password_Needs_Hehash

La fonction Password_Needs_Hehash déterminera si le hachage de mot de passe actuellement stocké doit être mis à jour en fonction du hachage de mot de passe donné, de l'algorithme sélectionné, du coût et d'autres options. La signature de la fonction est la suivante:

 <span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">password_needs_rehash</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$hash</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$algo</span></span><span> , </span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$options</span></span><span> )
</span></span>
  • $ Hash : Le hachage de mot de passe qui doit être vérifié.

  • $ algo : l'algorithme de hachage utilisé (tel que Mord_Default ou Password_Bcrypt ).

  • $ Options : un ensemble d'options de configuration qui incluent généralement le coût du hachage.

La fonction de cette fonction est de vérifier si le hachage du mot de passe actuel répond aux exigences de configuration actuelles. S'il ne correspond pas, il renvoie True , indiquant que le hachage doit être mis à jour.

2. Problèmes de configuration courants

(1) Password_default peut changer

Password_default est l'algorithme de hachage par défaut dans PHP. Il utilise généralement BCrypt , mais peut être remplacé à l'avenir par l'amélioration de l'algorithme. Si la version PHP est mise à niveau ou que la bibliothèque de sécurité modifie, Password_default peut utiliser le nouvel algorithme.

Par exemple, supposons que dans PHP 5.6, vous utilisez Password_default pour générer un hachage de mot de passe et le stocker. Lorsque PHP est mis à niveau vers 7.x, Password_Default peut devenir un algorithme différent (en supposant qu'il passe de Bcrypt à Argon2 ). Si vous utilisez Password_Needs_Hehash pour vérifier le hachage de mot de passe, ce qui suit peut se produire:

  • Le mot de passe stocké utilise l'ancien algorithme de hachage.

  • Le système nécessite un nouvel algorithme de hachage (tel que Argon2 ), mais Password_needs_rehash ne peut pas détecter ces différences.

Solution

Pour éviter cela, il est préférable de spécifier explicitement un algorithme au lieu de s'appuyer sur Password_default , en particulier dans les environnements de production. Même si PHP passe à un nouvel algorithme à l'avenir, il peut vous assurer que vous utilisez un algorithme de hachage clair qui répond aux besoins du projet.

 <span><span><span class="hljs-variable">$hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, PASSWORD_BCRYPT);
</span></span>
(2) changements de facteur de coût

Password_needs_rehash vérifie également le facteur de coût du hachage de mot de passe (par exemple, le facteur de coût de Bcrypt). Si vous modifiez le facteur de coût dans la configuration de votre système (par exemple, de 10 à 12), et l'ancien hachage de mot de passe utilise toujours un facteur de coût inférieur, Password_Needs_Hash peut ne pas détecter correctement que le hachage doit être mis à jour.

Solution

Assurez-vous toujours que le facteur de coût actuel est utilisé chaque fois que le hachage de mot de passe est généré. Pour éviter les mises à jour de hachage de mot de passe, vous pouvez vérifier et mettre à jour le hachage du mot de passe à chaque fois que l'utilisateur se connecte.

 <span><span><span class="hljs-variable">$options</span></span><span> = [</span><span><span class="hljs-string">'cost'</span></span><span> =&gt; </span><span><span class="hljs-number">12</span></span><span>];  </span><span><span class="hljs-comment">// Utilisez le bon facteur de coût</span></span><span>
</span><span><span class="hljs-variable">$hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, PASSWORD_BCRYPT, </span><span><span class="hljs-variable">$options</span></span><span>);
</span></span>
(3) Le mot de passe_needs_rehash est appelé de manière inappropriée

Password_needs_rehash nécessite trois paramètres: valeur de hachage, algorithme et options de configuration. Si ces paramètres sont passés de manière incorrecte, la fonction peut ne pas fonctionner correctement. Les questions courantes comprennent:

  • Le tableau des options $ n'est pas adopté correctement, entraînant la perte de facteurs de coût ou d'autres paramètres de configuration.

  • Le hachage passé ne correspond pas à l'algorithme utilisé pour générer ce hachage.

Solution

Assurez-vous de passer les paramètres corrects lors de l'appel Password_Needs_Hash . Voici un exemple:

 <span><span><span class="hljs-variable">$hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, PASSWORD_BCRYPT, [</span><span><span class="hljs-string">'cost'</span></span><span> =&gt; </span><span><span class="hljs-number">12</span></span><span>]);

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">password_needs_rehash</span></span><span>(</span><span><span class="hljs-variable">$hash</span></span><span>, PASSWORD_BCRYPT, [</span><span><span class="hljs-string">'cost'</span></span><span> =&gt; </span><span><span class="hljs-number">12</span></span><span>])) {
    </span><span><span class="hljs-variable">$hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, PASSWORD_BCRYPT, [</span><span><span class="hljs-string">'cost'</span></span><span> =&gt; </span><span><span class="hljs-number">12</span></span><span>]);
}
</span></span>

Assurez-vous que $ hash est cohérent avec l'algorithme sélectionné et les options de configuration.

3. Autres précautions

(1) Le hachage du mot de passe doit être mis à jour régulièrement

Les algorithmes et configurations de hachage de mot de passe peuvent devenir plus puissants au fil du temps, mais peuvent également être dépassés à un moment donné. Par conséquent, en plus d'utiliser Password_Needs_Hehash pour déterminer si le hachage de mot de passe doit être mis à jour, il s'agit également d'une bonne pratique de sécurité de réinitialiser régulièrement le hachage de mot de passe. Vous pouvez vérifier si le hachage doit être mis à jour chaque fois que l'utilisateur se connecte.

(2) Problèmes de compatibilité

Parfois, vous devrez peut-être être compatible avec un certain nombre de versions ou configurations PHP différentes. Dans ce cas, le comportement de Password_Needs_Hash peut être affecté par les différences entre les différentes versions. Par conséquent, assurez-vous que votre système est compatible avec la version de PHP que vous utilisez et l'ajustez en conséquence au besoin.

4. Résumé

Password_needs_rehash est un outil puissant pour détecter si le hachage de mot de passe répond aux exigences de configuration actuelles. Cependant, lors de l'utilisation réelle, nous pouvons rencontrer des problèmes de configuration, ce qui conduit à un jugement inexact de la fonction. Les problèmes de configuration courants incluent des changements d'algorithme, des mises à jour du facteur de coût et une mauvaise transmission des paramètres. La solution à ces problèmes est de spécifier explicitement l'algorithme de hachage et le facteur de coût, s'assurer que la configuration actuelle est utilisée chaque fois que le mot de passe est mis à jour et pour examiner régulièrement les politiques de sécurité de mot de passe.

En comprenant ces problèmes communs et leurs solutions, nous pouvons mieux assurer la sécurité des mots de passe des utilisateurs et éviter les risques de sécurité potentiels.