Tôi đang triển khai dịch vụ web RESTful trong đó người dùng phải gửi mã xác minh đã ký cùng với yêu cầu để tôi có thể đảm bảo rằng yêu cầu không bị người trung gian giả mạo. Cách thực hiện hiện tại của tôi như sau.
Mã thông báo xác minh là một đối tượng VerifData được tuần tự hóa thành một Chuỗi, sau đó được băm và mã hóa.
class VerifData {
int prop1;
int prop2;
}
Trong dịch vụ của mình, tôi đặt dữ liệu được tuần tự hóa vào một phiên bản của VerifData và sau đó tuần tự hóa nó bằng cách sử dụng Jackson ObjectMapper và được chuyển đến công cụ xác minh cùng với mã xác minh.
VerfiData verifData = new VerifData(12345, 67890);
ObjectMapper mapper = new ObjectMapper();
String verifCodeGenerated = mapper.writeValueAsString(verifData);
Nhưng có vẻ như mỗi khi vùng chứa ứng dụng được khởi động, thứ tự của các thuộc tính được ObjectMapper ánh xạ thành một chuỗi sẽ thay đổi.
Ví dụ: một lần nó sẽ là
{"prop1":12345,"prop2":67890}
và lần khác nó sẽ là
{"prop2":67890,"prop1":12345}
Vì vậy, nếu khách hàng đã tuần tự hóa cá thể VerifData thành Chuỗi đầu tiên, có 50% khả năng nó bị lỗi mặc dù nó đúng.
Có cách nào để giải quyết vấn đề này không? Tôi có thể chỉ định thứ tự của các thuộc tính để ánh xạ bằng ObjectMapper (như theo thứ tự tăng dần) không? Hoặc có cách nào khác để thực hiện tốt nhất bước xác minh này không. Cả triển khai máy khách và máy chủ đều do tôi phát triển. Tôi sử dụng API bảo mật Java để ký và xác minh.