J'ai un cas d'utilisation où je dois générer md5
hachage d'un objet JSON
et comparer les hachages dans le serveur et le navigateur.
Le client du navigateur génère du hachage, puis demande au serveur le hachage de la même ressource [qui se trouve être un objet JSON], et compare les deux hachages pour décider de la suite des opérations.
Pour le serveur, j'utilise Python
et le client du navigateur est dans Javascript
.
Pour moi, les hachages générés dans les deux cas ne correspondent pas. Voici mon code:
Python :
>>> import hashlib
>>> import json
>>> a = {"candidate" : 5, "data": 1}
>>> a = json.dumps(a, sort_keys = True).encode("utf-8")
>>> hashlib.md5(a).hexdigest()
>>> 12db79ee4a76db2f4fc48624140adc7e
[~ # ~] js [~ # ~] : j'utilise md5 pour le hachage dans le navigateur
> var hash = require("md5")
> var data = {"candidate":5, "data":1}
> data = JSON.stringify(data)
> md5(data)
> 92e99f0a99ad2a3b5e02f717a2fb83c2
Qu'est-ce que je fais mal?
Vous supposez que les deux langues génèrent un JSON qui semble identique.
>>> json.dumps({"candidate" : 5, "data": 1}, sort_keys=True)
'{"candidate": 5, "data": 1}'
js> JSON.stringify({"candidate" : 5, "data": 1})
"{\"candidate\":5,\"data\":1}"
Heureusement, ils le peuvent.
>>> a = json.dumps({"candidate" : 5, "data": 1}, sort_keys=True, indent=2)
'{\n "candidate": 5,\n "data": 1\n}'
js> var a = JSON.stringify({"candidate" : 5, "data": 1}, null, 2)
"{\n \"candidate\": 5,\n \"data\": 1\n}"
Et maintenant, les hachages seraient les mêmes.
Python:
>>> hashlib.md5(a.encode("utf-8")).hexdigest()
>>> d77982d217ec5a9bcbad5be9bee93027
JS:
>>> md5(a)
>>> d77982d217ec5a9bcbad5be9bee93027