如何给protobuf消息添加签名?

Luk*_*ang 5 signature protocol-buffers

有没有通用的方法来签署 protobuf 消息?我可以想象的是在消息中添加数据字段和签名字段,并使用 SerializeToArray(在 cpp 中)或 ToByteArray(在 c# 中)获取原始字节,然后使用 md5 或 sha256 .. 等来计算哈希值,然后将哈希值分配给字段“sign”。但是我不知道不同语言之间或 proto2 和 proto3 中的原始字节是否有任何不同?

Mar*_*ell 1

只要您的散列算法足够强大,您讨论的签名方法就可以用于完整性验证目的。如果它是为了比完整性校验和更强的东西,您可能应该使用真正的加密哈希(带有公钥+私钥),因为任何人都可以以其他方式签署自己的任意有效负载,从而破坏了这一点。

您还看到讨论决定论。protobuf 中的原始字节并不完全确定。在 protobuf 中表示相同有效负载的有效方式有多种,包括:

  • 重新排序字段(数字顺序是“应该”,而不是“必须”)
  • 包含或省略零(proto2 和 proto3 之间不同)
  • 打包与顺序“重复”编码
  • 事实上,“地图”通常由某些特定于平台的内置地图/字典类型支持,这些类型通常不定义顺序,因此理论上它每次都会有所不同
  • 实际上这并不是一个问题,但理论上您可以通过包含不必要的零字节组来对任意长度(最多 10 字节)的 varint 进行编码;类似于文本(JSON 等)中表示 42、042、0042 和 0000000042 都代表相同的整数;没有人这样做,但是:这是有效的