【发布时间】:2015-02-19 01:51:23
【问题描述】:
我正在实现一个 RESTful Web 服务,用户必须在请求中发送一个签名的验证令牌,以便我可以确保请求没有被中间人篡改。我目前的实现如下。
验证令牌是一个 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 进行签名和验证。
【问题讨论】:
标签: java json serialization jackson