最佳答案
我正在实现一个 RESTful Web 服务,其中用户必须在发送请求的同时发送一个签名的验证令牌,这样我就可以确保请求没有被中间人篡改。我当前的实现如下。
Verification token is a VerifData object serialized into a String and then hashed and encrypted.
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}
and another time it would be
{"prop2":67890,"prop1":12345}
因此,如果客户端已经将 VerifData 实例序列化为第一个 String,那么即使它是正确的,也有50% 的可能性会失败。
有办法解决吗?我是否可以指定 ObjectMapper 映射属性的顺序(如升序) ?或者有没有其他方法可以最好地实现这个验证步骤。客户端和服务器实现都是由我开发的。我使用 JavaSecurityAPI 进行签名和验证。