devrais-je utiliser si (STRCMP (md5 ($ string), $ hachage) == 0) code> ou
si (md5 ($ string) == $ hachage) code> p>
5 Réponses :
Je pense MD5 ne génère que des caractères ASCII qui n'a pas besoin d'une comparsion sûre binaire. P> si (md5 ($ string) == $ Hash) code> est meilleur, car vous n'avez qu'une comparaison au lieu de 2 (STCMP & ==). P>
Look @mm réponse. Le second de tout MD5 est obsolète (prouvé qu'il peut être piraté). Utilisez SHA (un meilleur, pas le meilleur).
Bien sûr, vous devriez utiliser SHA sur MD5. Mais le questionneur a demandé qu'il devrait utiliser. Si quelqu'un vous demande: «Voulez-vous une crème glacée à la fraise ou une crème glacée au chocolat?», Vous ne pouvez pas répondre à la crème glacée à la vanille ». En outre, la question ne concerne pas d'utiliser un algorithme de hachage, mais sur la comparaison des valeurs.
Nous ne parlons pas de glace ici, mais de la sécurité. La réponse est donc "n'utilise rien de ce que vous avez proposé ici!". Et BTW: aussi SHA-1 ne doit pas B> être utilisé pour les mots de passe.
Qui a dit que cela concerne la sécurité? Peut-être qu'il veut juste que ce soit le contenu d'un fichier pour voir si c'est égal à un autre.
Si vous comparez des chaînes, utilisez Vous devez utiliser Si vous utilisez des mots de passe de hachage, envisagez d'utiliser un algorithme de hachage lent et puissant tel que PBKDF2, plutôt que MD5. P> strcmp code> ou
=== code>. Les gens préfèrent
=== code> parce que
STRCMP code> peut être déroutant (il renvoie
0 code> sur le succès, wat). P>
=== code>, pas
== code>.
== code> convertira les deux opérandes en entiers s'ils peuvent être interprétés comme tels, et parce qu'un hachage de MD5 ne correspond pas à un entier, ils seront tronqués autour de la moitié. Par conséquent, seules les premières moitiés des hachages doivent être égales. Voir http://phpsadness.com/sad/47 . P>
Wow ... c'est vraiment triste.
Je sais que c'est une ancienne réponse, mais il est important de noter que cette "tristesse" a été affichée à PHP 5.4.4. 3v4l.org/edcdy nous montre que des versions 5.4.4 à 5.6.30 et 7+, la déclaration ci-dessus N'est-ce pas vrai, bien que des versions inférieures auront effectivement une déclaration vraie comparant seulement la moitié de la chaîne.
Bien que cela sonne très contre-intuitif, vous devriez comparer une comparaison complète de la chaîne, en évitant les optimisations (c'est-à-dire en sortant tôt si un caractère est différent). P>
Voici quelques liaisons sur le problème: P>
Et voici quelques idées afin de le réparer: p>
hachageaux () code>
si disponible strong> (PHP 5.6 et plus grand). LI>
hash_equals () code> polyfill) li>
comparaisements () code>) li>
ul>
Si vous utilisez quelque chose de plus récent que PHP 5.6 (et y compris), vous devez utiliser COMPARATEUR DE SOIGNE DE SOIMENT DE TIMING FONCTION.
if (hash_equals($expected, $correct)) { }
En réalité, vous devez utiliser En cas de retombe, vous pouvez utiliser Ce polyfill . Il fonctionne actuellement avec PHP> = 5.3.7. P>
Et si vous ne pouvez pas vraiment utiliser ceci, il existe toujours Password_verify code>
Pour cela, utilisez également tous les autres Mot de passe _ * code>.
Ils sont disponibles en PHP> = 5.5.0. P>
hash_equals code>
(et polyfills pour cela) comme @mm. déjà dit. P>
Utilisez
strcmp code> dans les fonctions de tri personnalisées. Pour une utilisation "normale", la comparaison directe des chaînes est plus facile et plus facile à lire.
Pour toute personne lisant ce fil, Vous ne devriez probablement pas faire cela du tout B> .
Si vous voulez simplement comparer les hashes de manière fiable, utilisez simplement
=== code>. Si vous vous souciez vraiment de la sécurité et des attaques de chronométrage potentielles (même malgré la gigue de réseau), vous devez consulter Ce ou Cette discussion ou utilisez le < Code> hash_equals () code> fonction (PHP 5.6+).
Non MD5, pas de MD5, pas de MD5!