62 votes

Comment hacher cryptographiquement un objet JSON ?

La question suivante est plus complexe qu'il n'y paraît à première vue.

Supposons que j'ai un objet JSON arbitraire, qui peut contenir n'importe quelle quantité de données, y compris d'autres objets JSON imbriqués. Ce que je veux, c'est un hachage/digesté cryptographique des données JSON, sans tenir compte du formatage JSON lui-même (par exemple, ignorer les nouvelles lignes et les différences d'espacement entre les jetons JSON).

La dernière partie est une exigence, car le JSON sera généré/lu par une variété de (dé)sérialiseurs sur un certain nombre de plateformes différentes. Je connais au moins une bibliothèque JSON pour Java qui supprime complètement le formatage lors de la lecture des données pendant la désérialisation. En tant que telle, elle brisera le hachage.

La clause de données arbitraires ci-dessus complique également les choses, car elle m'empêche de prendre des champs connus dans un ordre donné et de les concaténer avant le hachage (pensez à la façon dont fonctionne la méthode non cryptographique hashCode() de Java).

Enfin, il n'est pas non plus souhaitable de hacher la totalité de la chaîne JSON en tant que bloc d'octets (avant la désérialisation), car certains champs du JSON doivent être ignorés lors du calcul du hachage.

Je ne suis pas sûr qu'il existe une bonne solution à ce problème, mais toute approche ou réflexion est la bienvenue =)

1 votes

Avez-vous jeté un coup d'œil au DSig XML ? Ils ont le même problème et ont une spécification de "canonicalisation" assez complexe.

5 votes

Je ne peux m'empêcher de remarquer à quel point votre nom correspond à la question.

6 votes

Ceci est en cours de normalisation. Voir le projet de RFC sur la signature Web JSON (JWS). tools.ietf.org/html/draft-ietf-jose-json-web-signature-17

0voto

RasmusKL Points 582

Je ferais tous les champs dans un ordre donné (par ordre alphabétique par exemple). Pourquoi les données arbitraires font-elles une différence ? Vous pouvez simplement itérer sur les propriétés (comme la réflexion).

Sinon, je chercherais à convertir la chaîne brute json en une forme canonique bien définie (en supprimant tous les formatages superflus) - et à la hacher.

0voto

Nous avons rencontré un problème simple avec le hachage des charges utiles codées en JSON. Dans notre cas, nous utilisons la méthodologie suivante :

  1. Convertir les données en objet JSON ;
  2. Encodage de la charge utile JSON en base64
  3. Message digest (HMAC) de la charge utile générée en base64 .
  4. Transmettre la charge utile en base64 .

Avantages de l'utilisation de cette solution :

  1. Base64 produira le même résultat pour une charge utile donnée.
  2. Comme la signature résultante sera dérivée directement des données utiles codées en base64 et que les données utiles en base64 seront échangées entre les points d'extrémité, nous serons certains que la signature et les données utiles seront conservées.
  3. Cette solution résout les problèmes qui se posent en raison de la différence d'encodage des caractères spéciaux.

Inconvénients

  1. Le codage/décodage de la charge utile peut ajouter des frais généraux.
  2. Les données codées en base64 sont généralement plus grandes de 30 % que les données utiles originales.

0 votes

Les données codées en base64 sont généralement d'environ 30% plus grande que la charge utile originale.

0 votes

Ne faudrait-il pas trier les clés des objets en premier (par exemple, par ordre alphabétique), car JSON ne garantit pas l'ordre des clés des objets, de sorte que des données identiques peuvent avoir des ordres de clés différents, ce qui donne un hachage différent ?

0 votes

Le tri de la chaîne originale n'est pas nécessaire puisque vous allez hacher la charge utile b64 et non la chaîne JSON originale elle-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X