Я впроваджую веб-службу RESTful, де користувач повинен надіслати підписаний маркер підтвердження разом із запитом, щоб я міг переконатися, що запит не підроблений посередником. Моя поточна реалізація така.
Маркер підтвердження - це об’єкт VerifData, серіалізований у рядок, а потім хешований та зашифрований.
class VerifData {
int prop1;
int prop2;
}
У своїй службі я розміщую дані для серіалізації в екземпляр VerifData, а потім серіалізую їх за допомогою Jackson ObjectMapper і передаю їх у механізм перевірки разом із маркером перевірки.
VerfiData verifData = new VerifData(12345, 67890);
ObjectMapper mapper = new ObjectMapper();
String verifCodeGenerated = mapper.writeValueAsString(verifData);
Але здається, що кожного разу, коли запускається контейнер програми, порядок властивостей, що відображаються у рядок за допомогою ObjectMapper, змінюється.
Приклад: одного разу це було б
{"prop1":12345,"prop2":67890}
а іншим разом це було б
{"prop2":67890,"prop1":12345}
Отже, якщо клієнт серіалізував екземпляр VerifData як у перший рядок, існує 50% ймовірності його помилки, навіть якщо він правильний.
Чи є спосіб обійти це? Чи можу я вказати порядок властивостей для зіставлення за допомогою ObjectMapper (наприклад, за зростанням)? Або є інший спосіб найкращим чином здійснити цей етап перевірки. Як клієнтська, так і серверна реалізація розроблені мною. Я використовую Java Security API для підписання та перевірки.