Comment hachage cryptographique un objet JSON?

La question suivante est plus complexe qu'il peut d'abord sembler.

Supposer que j'ai eu à l'arbitraire d'un objet JSON, qui peut contenir n'importe quelle quantité de données, y compris d'autres imbriquée objets JSON. Ce que je veux, c'est un hachage cryptographique/recueil de données JSON, sans égard à la réalité de JSON mise en forme elle-même (par exemple: le fait d'ignorer les retours à la ligne et l'espacement des différences entre le JSON jetons).

La dernière partie est une exigence, comme le JSON sera généré/lu par une variété de (de)sérialiseurs sur un certain nombre de plates-formes différentes. Je connais au moins un JSON bibliothèque Java qui supprime complètement mise en forme lors de la lecture des données lors de la désérialisation. En tant que tel, il va briser le hachage.

L'arbitraire de la clause de données ci-dessus complique aussi les choses, car il m'empêche de prendre des domaines connus dans un ordre donné et la concaténation avant hasing (pense à peu près la Java non cryptographiques hashCode() méthode fonctionne).

Enfin, le hachage de l'ensemble de la Chaîne JSON comme un bloc d'octets (avant la désérialisation) n'est pas souhaitable, car il y a des champs dans le JSON qui doit être ignoré lors du calcul de la valeur de hachage.

Je ne suis pas sûr qu'il y est une bonne solution à ce problème, mais je souhaite la bienvenue à toutes les approches ou des pensées =)

  • Avez-vous regarder le XML DSig? Ils ont le même problème et ont une assez complexe "canonique" spéc.
  • Je peux pas m'empêcher de remarquer comment apt votre nom est sur la question.
  • C'est standardisée. Voir le JSON Web Signature (JWS) projet de RFC. tools.ietf.org/html/draft-ietf-jose-json-web-signature-17
  • que RFC spécifie uniquement un format JSON pour stocker la charge utile+signature+certains en-têtes, pas de JSON de mise en forme canonique est mentionné
  • il existe déjà mise en œuvre dans Go / Node.js / Python que vous pouvez utiliser et la mise en forme canonique pour vous.
  • Vous pouvez également jeter un oeil à ce RFC projet: dpaste-bkero.paas.allizom.org/MtkA/raw