Я реализую веб-службу 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 для подписи и проверки.