如何为protobuf消息添加签名?

5

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

1个回答

1
您讨论的签名方法对于完整性验证是可以的,只要您的哈希算法足够强大。如果它用于比完整性校验更强的任何内容,则应该使用真正的加密哈希(具有公共+私有密钥),否则任何人都可以签署自己的任意有效负载,从而使其失去意义。
您还谈到了确定性。protobuf中的原始字节并不完全确定。在protobuf中表示相同有效负载的多种有效方式,包括:
- 重新排序字段(数字顺序是“应该”,而不是“必须”) - 包括或省略零(proto2和proto3之间不同) - 打包与顺序“重复”编码 - “map”通常由一些特定于平台的内置映射/字典类型支持,这些类型通常不定义顺序,因此理论上它可以每次都有所不同。 - 实际上并不是一个问题,但理论上你可以通过包含不必要的零字节组来使用任意长度(最多10个字节)对varint进行编码;类似于文本(JSON等)中说42、042、0042和0000000042都代表同一个整数;没有人这样做,但:它是有效的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接