Devo scambiare oggetti JSON tra diverse piattaforme e implementazioni di un servizio e rendere la sua integrità verificabile tramite firme digitali. Quindi una piattaforma A creerebbe un tale oggetto e creerebbe una firma digitale. Tale firma viene quindi inclusa nell'oggetto e inviata alla piattaforma B. Gli oggetti JSON possono contenere attributi e dati arbitrari.Firma oggetti JSON
E.g. in PHP:
function signObject($jsonObjectToSign, $privateKey) {
$jsonObjectToSign->signature = "";
$msgToSign = json_encode($jsonObjectToSign);
openssl_sign($msgToSign, $jsonObjectToSign->signature, $privateKey, OPENSSL_SLGO_SHA1);
return $jsonObjectToSign;
}
Il problema è che ad es. in Java, non è possibile stabilire se gli attributi di un oggetto JSON saranno nello stesso ordine in cui sono stati aggiunti (tramite JSONObject.put()). Quindi, se faccio un
$json = json_encode('{"a":1, "b":2}');
in PHP, firmare questo oggetto come detto in precedenza, il trasferimento a un server basato su Java, decodificare l'oggetto JSON e quindi provare a verificare la firma, probabilmente avrei avuto un diverso ordine degli attributi dell'oggetto.
Quindi, quello che mi serve, è un modo affidabile per creare una stringa da un oggetto JSONObject, indipendentemente dalla lingua o dalla piattaforma utilizzata.
L'esempio precedente deve sempre emettere {"a":1, "b":2}
e MAI {"b":2, "a":1}
. Sfortunatamente, questo è il solito caso, ad es. in Java.
Esiste una "best practice" per firmare oggetti JSON in modo sicuro?
Ma permettetemi di descrivere il problema in un altro modo:
Diciamo che voglio fare questo in Java (o qualsiasi altra lingua):
JSONObject j = new JSONObject();
j.put("a", 1);
j.put("b", 2);
Ora, ho bisogno di una funzione di serializzazione, che restituisce sempre la stessa rappresentazione di stringa per questo oggetto, indipendentemente da come e con quale linguaggio viene creato questo oggetto.
Non sono sicuro se [questo] (http://stackoverflow.com/questions/4670494/how-to-cryptographically-hash-a-json-object) è un duplicato, ma vale sicuramente la pena leggerlo. Alcune idee sono proposte per canonicalizzare JSON per garantire un hash riproducibile. –