2010-08-27 3 views
3

J'ai un hash MD5 généré, que je voudrais comparer à un autre hash MD5 à partir d'une chaîne. La déclaration ci-dessous est fausse, même si elles se ressemblent lorsque vous les imprimez et devraient être vraies.Comparer le résultat de hexdigest() à une chaîne

hashlib.md5("foo").hexdigest() == "acbd18db4cc2f85cedef654fccc4a4d8" 

Google m'a dit que je devrais coder le résultat de hexdigest(), car il ne retourne pas une chaîne. Cependant, le code ci-dessous ne semble pas fonctionner non plus.

hashlib.md5("foo").hexdigest().encode("utf-8") == "foo".encode("utf-8") 

Répondre

9

Python 2.7, .hexdigest() ne retourne une str

>>> hashlib.md5("foo").hexdigest() == "acbd18db4cc2f85cedef654fccc4a4d8" 
True 
>>> type(hashlib.md5("foo").hexdigest()) 
<type 'str'> 

Python 3.1

.md5() ne prend pas unicode (qui "foo" est), de sorte que doit être codé sur un flux d'octets.

>>> hashlib.md5("foo").hexdigest() 
Traceback (most recent call last): 
    File "<pyshell#1>", line 1, in <module> 
    hashlib.md5("foo").hexdigest() 
TypeError: Unicode-objects must be encoded before hashing 

>>> hashlib.md5("foo".encode("utf8")).hexdigest() 
'acbd18db4cc2f85cedef654fccc4a4d8' 

>>> hashlib.md5("foo".encode("utf8")).hexdigest() == 'acbd18db4cc2f85cedef654fccc4a4d8' 
True 
+0

Votre dernier code a bien fonctionné. D'une manière ou d'une autre, je n'ai reçu aucun message d'erreur lors des tests sur mon serveur de développement AppEngine. J'aurais dû le tester dans la console python à la place. Je m'excuse et je le ferai la prochaine fois. – nip3o

2

hexdigest returns a string. Votre première instruction renvoie True dans python-2.x.

En python-3.x, vous devez encoder l'argument à la fonction md5, dans ce cas l'égalité est également True. Sans codage, il augmente TypeError.

5

L'utilisation de == pour une comparaison de hachage est probablement une faille de sécurité.

https://groups.google.com/forum/?fromgroups=#!topic/keyczar-discuss/VXHsoJSLKhM

Il est possible pour un attaquant de rechercher des différences temporelles et itérer à travers le keyspace efficacement et de trouver une valeur qui passera le test d'égalité.

+2

Python 3.3 ajoute une fonction pour la comparaison de hachage sécurisé: http://docs.python.org/3/library/hmac#hmac.compare_digest –

Questions connexes