我正在实施一个 RESTful Web 服务,其中用户必须连同请求一起发送一个签名的验证令牌,以便我可以确保该请求没有被中间人篡改。我目前的实现如下。
Verification token 是一个 VerifData 对象,序列化为 String,然后进行散列和加密。
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 进行签名和验证。
原文由 Lizzy 发布,翻译遵循 CC BY-SA 4.0 许可协议
来自 Jackson Annotations 文档: