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}"}
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
Vous devez vous connecter pour publier un commentaire.
Vous vous posez pour une mise en œuvre de quelque chose à travers plusieurs langues pour être la même... vous êtes presque certainement hors de la chance. Vous avez deux options:
OriginalL'auteur
Vous pourriez être intéressé par mnp paquet objet de hachage, qui semble avoir une assez bonne activité & niveau de fiabilité.
console.log(objectHash(testobj1))
.OriginalL'auteur
C'est une vieille question, mais je pensais ajouter une solution à cette question pour google arbitres.
La meilleure façon de le signer et de hachage objets JSON maintenant est d'utiliser JSON Web Jetons. Cela permet à un objet d'être signé, haché et vérifiées par d'autres basés sur la signature. Il est offert pour un tas de différentes technologies et active de développement du groupe.
Javascript n'a jamais garanti l'ordre des clés dans des objets - ce n'est pas quelque chose que vous devriez considérer lors de l'utilisation des objets. Je ne pense pas que l'OP a dit spécifiquement qu'il a voulu ignorer l'ordre des champs, seulement qu'il pensait que les différentes implémentations serait de les traiter différemment. Son travail autour gère efficacement les ce parce qu'il est la signature de la fin-le résultat, non pas d'un autre stringify appel.
Il a mentionné dans le point numéro trois de
stringify
les inconvénients résultant de la chaîne peut avoir différents champs de l'ordre. Je ne comprends toujours pas comment JWT peut produire le même hash/signature pour{"foo":"bar", "bar":"foo"}
et{"bar":"foo","foo":"bar"}
qui est fondamentalement la même, à l'exception de leur ordre des champs. Si ce n'est pas pour JWT, votre réponse n'est pas la chose exacte que l'OP (et moi) était à la recherche pour.Ne confondez pas les signatures et les tables de hachage, ils résoudre les différents problèmes. Une signature, c'est comme une table de hachage sur les stéroïdes avec un accent sur la sécurité. Hachages n'ont rien à voir avec la sécurité. JWT est probablement la meilleure solution pour la Fpo question que vous vous sûr de hachage, la vérification, la date d'expiration et la confiance inclus automatiquement. Vous obtiendrez des signatures différentes pour le même objet, à chaque fois, car un timestamp est inclus dans le haché de données automatiquement. Il sonne comme @Derp veut juste identiques hachages entre logiquement identiques objet de représentations, dans ce cas voir
object-hash
OriginalL'auteur
Vous pourrait normaliser le résultat de
stringify()
par l'application des règles telles que:Ce serait de vous laisser avec canonique représentation JSON de votre objet, qui vous permet ensuite de manière fiable de hachage.
C'est vrai, mais j'ai vu une seule cité de cordes qui prétend être JSON.
Peut-être, mais ceux qui sont brisés, et je doute vraiment que vous voyez que, dans toute implémentation JSON natif d'une langue.
Comment voulez-vous des clés de tri dans un JS objet?
OriginalL'auteur