7
votes

Quelle est la meilleure façon de comparer les chaînes hachées? (Php)

devrais-je utiliser si (STRCMP (md5 ($ string), $ hachage) == 0) ou si (md5 ($ string) == $ hachage)


4 commentaires

Utilisez strcmp 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 .


Si vous voulez simplement comparer les hashes de manière fiable, utilisez simplement === . 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 () fonction (PHP 5.6+).


Non MD5, pas de MD5, pas de MD5!


5 Réponses :


-4
votes

Je pense si (md5 ($ string) == $ Hash) est meilleur, car vous n'avez qu'une comparaison au lieu de 2 (STCMP & ==).

MD5 ne génère que des caractères ASCII qui n'a pas besoin d'une comparsion sûre binaire.


4 commentaires

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



16
votes

Si vous comparez des chaînes, utilisez strcmp ou === . Les gens préfèrent === parce que STRCMP peut être déroutant (il renvoie 0 sur le succès, wat).

Vous devez utiliser === , pas == . == 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 .

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.


2 commentaires

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.



28
votes

Vous devez faire très attention lorsque vous comparez directement des hashes pour des éléments tels que l'authentification, comme vous pouviez ouvrir une fenêtre à une attaque de synchronisation . .

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

Voici quelques liaisons sur le problème:


0 commentaires

5
votes

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)) {

}


0 commentaires

0
votes

En réalité, vous devez utiliser Password_verify Pour cela, utilisez également tous les autres Mot de passe _ * . Ils sont disponibles en PHP> = 5.5.0.

En cas de retombe, vous pouvez utiliser Ce polyfill . Il fonctionne actuellement avec PHP> = 5.3.7.

Et si vous ne pouvez pas vraiment utiliser ceci, il existe toujours hash_equals (et polyfills pour cela) comme @mm. déjà dit.


0 commentaires