Wdrażam usługę sieciową RESTful, w której użytkownik musi wysłać podpisany token weryfikacyjny wraz z żądaniem, aby upewnić się, że żądanie nie zostało zmodyfikowane przez pośrednika. Moja obecna realizacja jest następująca.
Token weryfikacyjny to obiekt VerifData serializowany w łańcuch, a następnie zaszyfrowany i zaszyfrowany.
class VerifData {
int prop1;
int prop2;
}
W mojej usłudze umieszczam dane do serializacji w instancji VerifData, a następnie serializuję je za pomocą Jackson ObjectMapper i przesyłam do silnika weryfikacji wraz z tokenem weryfikacyjnym.
VerfiData verifData = new VerifData(12345, 67890);
ObjectMapper mapper = new ObjectMapper();
String verifCodeGenerated = mapper.writeValueAsString(verifData);
Wydaje się jednak, że za każdym razem, gdy uruchamiany jest kontener aplikacji, kolejność właściwości mapowanych na ciąg znaków przez ObjectMapper zmienia się.
Np .: kiedyś to będzie
{"prop1":12345,"prop2":67890}
i innym razem będzie
{"prop2":67890,"prop1":12345}
Jeśli więc klient zserializował wystąpienie VerifData w pierwszym ciągu, istnieje 50% szans na niepowodzenie, mimo że jest poprawne.
Czy można to obejść? Czy mogę określić kolejność właściwości do mapowania przez ObjectMapper (jak w porządku rosnącym)? Czy jest inny sposób, aby najlepiej wdrożyć ten krok weryfikacji. Zarówno implementacje klienta, jak i serwera są opracowywane przeze mnie. Do podpisywania i weryfikacji używam Java Security API.