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
1 votes
Cette RFC spécifie uniquement un format JSON pour stocker les données utiles, la signature et certains en-têtes, sans mentionner la canonisation JSON.
0 votes
@RomanPlášil il y a des implémentations existantes en Go / Node.js / Python que vous pouvez utiliser et qui font la canonisation pour vous.
1 votes
Vous pouvez également jeter un coup d'œil à ce projet de RFC : dpaste-bkero.paas.allizom.org/MtkA/raw