web-dev-qa-db-fra.com

Générer un hachage md5 de JSON et comparer en Python et JavaScript

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?

10
xssChauhan

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
16