Comment fiable de hachage des objets JavaScript?

Est-il un moyen fiable pour JSON.stringify un objet JavaScript qui garantit que les ceated chaîne JSON est le même sur tous les navigateurs, node.js et ainsi de suite, étant donné que l'objet Javascript est le même?

Je veux hachage objets JS comme

{
  signed_data: object_to_sign,
  signature:   md5(JSON.stringify(object_to_sign) + secret_code)
}

et de les transmettre autour de à travers des applications web (par exemple, Python et node.js) et l'utilisateur, de sorte que l'utilisateur peut s'authentifier auprès d'un service et de montrer le prochain service "signé de données" pour que, afin de vérifier si les données sont authentiques.

Cependant, je suis tombé sur le problème que JSON.stringify n'est pas vraiment unique à travers la mise en œuvre:

  • Dans node.js /V8, JSON.stringify renvoie une chaîne JSON inutile sans les espaces, tels que '{"user_id":3}.
  • Python simplejson.les vidages de feuilles de certains espaces, par exemple '{"user_id": 3}'
  • Probablement d'autres stringify implémentations peuvent traiter différemment les espaces, l'ordre des attributs, ou quoi que ce soit.

Est-il fiable multi-plateforme stringify méthode? Est-il un "nomalised JSON"?

Recommanderiez-vous d'autres façons de hachage objets comme cela?

Mise à JOUR:

C'est ce que j'utilise comme une solution de contournement:

normalised_json_data = JSON.stringify(object_to_sign)
{
  signed_data: normalised_json_data,
  signature:   md5(normalised_json_data + secret_code)
}

Donc, dans cette approche, non pas l'objet lui-même, mais sa représentation JSON (ce qui est spécifique à la sigining plate-forme) est signé. Cela fonctionne bien parce que ce que je signe maintenant est sans ambiguïté chaîne et je peux facilement JSON.analyser les données après j'ai vérifié la signature de hachage.

L'inconvénient ici est que si j'envoie l'ensemble {signed_data, signature} objet JSON aussi, je dois les appeler JSON.analyser deux fois et il ne semble pas aussi bien parce que l'intérieur on obtient échappé:

{"signature": "1c3763890298f5711c8b2ea4eb4c8833", "signed_data": "{\"user_id\":5}"}
vous êtes à l'aide de json stringify - qui, comme un mécanisme de sérialisation - faire de hachage. je ne suis pas sûr que ce soit une bonne idée, précisément pour les raisons que vous avez rencontrés. peu importe, JSON.stringify est très limité, et je ne ferais pas confiance à de hachage ou de sérialiser mes informations. par exemple, essayez de JSON.stringify(new Error ("ne pas aller au travail"))
Je tiens également à l'auto-commentaire que le MD5 n'est pas la meilleure fonction de hachage à utiliser ici.

OriginalL'auteur nh2 | 2011-04-05