Ich implementiere einen RESTful-Webdienst, bei dem der Benutzer zusammen mit der Anfrage ein signiertes Bestätigungstoken senden muss, damit ich sicherstellen kann, dass die Anfrage nicht von einem Zwischenhändler manipuliert wurde. Meine aktuelle Implementierung ist wie folgt.
Das Verifikationstoken ist ein VerifData-Objekt, das in einen String serialisiert und dann gehasht und verschlüsselt wird.
class VerifData {
int prop1;
int prop2;
}
In meinem Dienst habe ich Daten, die serialisiert werden sollen, in eine Instanz von VerifData eingefügt und sie dann mit Jackson ObjectMapper serialisiert und zusammen mit dem Verifikationstoken an die Verifizierungs-Engine weitergeleitet.
VerfiData verifData = new VerifData(12345, 67890);
ObjectMapper mapper = new ObjectMapper();
String verifCodeGenerated = mapper.writeValueAsString(verifData);
Es scheint jedoch, dass sich bei jedem Start des Anwendungscontainers die Reihenfolge der Eigenschaften ändert, die von ObjectMapper einer Zeichenfolge zugeordnet werden.
Bsp.: Einmal wäre es
{"prop1":12345,"prop2":67890}
und ein anderes Mal wäre es
{"prop2":67890,"prop1":12345}
Wenn der Client die VerifData-Instanz als in den ersten String serialisiert hat, besteht eine 50% ige Wahrscheinlichkeit, dass sie fehlschlägt, obwohl sie korrekt ist.
Gibt es eine Möglichkeit, dies zu umgehen? Kann ich die Reihenfolge der Eigenschaften festlegen, die von ObjectMapper zugeordnet werden sollen (wie in aufsteigender Reihenfolge)? Oder gibt es eine andere Möglichkeit, diesen Überprüfungsschritt am besten umzusetzen? Sowohl Client- als auch Server-Implementierungen werden von mir entwickelt. Ich verwende die Java-Sicherheits-API zum Signieren und Überprüfen.