2010-03-25 16 views
1

Il s'agit d'une question générale sur le codage de caractères lors de l'utilisation de bibliothèques MD5 dans différentes langues. Ma préoccupation est: suppose que je produis un hachage MD5 à l'aide d'un objet chaîne Python natif, comme ceci:Problèmes de codage de caractères lors de la génération de table de hachage MD5

message = "hello world" 
m = md5() 
m.update(message) 

Ensuite, je prends une version hexagonale de ce hachage MD5 utilisant:

m.hexdigest() 

et envoyer le message & Hash MD5 via un réseau, disons un message JMS ou une requête HTTP.

Maintenant, je reçois ce message dans un programme Java sous la forme d'une chaîne Java native, avec la somme de contrôle. Ensuite, je produis un hachage MD5 en utilisant Java, comme celui-ci (en utilisant la bibliothèque Commons Codec):

String md5 = org.apache.commons.codec.digest.DigestUtils.DigestUtils.md5Hex(s) 

Mon sentiment est que cela est faux parce que je ne l'ai pas spécifié le caractère encodng à chaque extrémité. Ainsi, le hash d'origine sera basé sur les octets de la version Python de la chaîne; le Java sera basé sur les octets de la version Java de la chaîne, ces deux séquences d'octets ne seront souvent pas les mêmes - est-ce exact? Donc, vraiment, je dois spécifier "UTF-8" ou quoi que ce soit aux deux extrémités droite?

(Je reçois effectivement une erreur intermittente dans mon code où la somme de contrôle MD5 échoue, et je soupçonne que c'est la raison -. Mais parce qu'il est intermittent, il est difficile de dire si la modification de ce fixe ou non)

Merci!

Répondre

1

Oui, vous devez être explicite car la somme de contrôle MD5 est sur une séquence de BYTES, pas de caractères. Par conséquent, vous avez besoin d'une traduction prévisible des caractères en octets.

0

Oui, il est préférable de hacher le même codage aux deux extrémités. Décodez la chaîne Python en unicode avant de l'encoder.