1

Proto3 发行说明指出:

然而,确定性序列化不是跨语言规范的。由于未知字段,它在不同的构建中也不稳定,架构更改。需要规范序列化的用户,例如规范形式的持久存储、指纹识别等,应定义自己的规范化规范并使用反射 API 实现序列化程序,而不是依赖此 API。

我想要实现的是对 protobuf 消息进行确定性序列化,以携带加密签名。据我了解,由于序列化程序的差异,二进制数据可能会有所不同,并且签名将变得无效。

package Something

message Request {
  Payload payload = 1;

  // signature of serialised payload
  bytes signature = 2;

  message Payload {
    string user_id_from = 1;
    uint64 amount = 2;
    string user_id_to = 3;
  }
}

使用 protobuf 反射的方法是什么?

4

1 回答 1

0

这不能直接回答问题,但可以解决您的问题:不要将有效负载存储为消息,而是将序列化字节与签名一起存储。

message Request {
  // Serialized Payload message.
  bytes payload = 1;

  // signature of serialised payload
  bytes signature = 2;
}

message Payload {
  string user_id_from = 1;
  uint64 amount = 2;
  string user_id_to = 3;
}

这可能在代码中使用起来不太方便,但具有保留 protobuf 的所有向前和向后兼容性保证的优点。

它还使您在编写消息时不必对消息进行两次序列化(一次作为子字段,一次用于获取签名)。

于 2020-08-19T22:32:44.380 回答