protocol-buffers - 如何向 protobuf 消息添加签名?
问题描述
有没有一种通用的方式来签署 protobuf 消息?我可以想象的是在消息中添加数据字段和签名字段,并使用 SerializeToArray(in cpp) 或 ToByteArray(in c#) 获取原始字节,然后使用 md5 或 sha256 .. 等计算哈希值,然后将哈希值分配给字段“sign”。Bue 我不知道不同语言之间或 proto2 和 proto3 之间的原始字节是否有任何不同?
解决方案
只要您的散列算法足够强大,您讨论的签名方法就可以用于完整性验证。如果它用于比完整性校验和更强的任何东西,您可能应该使用真正的加密哈希(使用公钥+私钥),因为任何人都可以签署自己的任意有效负载,从而打破这一点。
您还看到讨论确定性。protobuf 中的原始字节不是完全确定的。在 protobuf 中有多种有效方式来表示相同的有效负载,包括:
- 重新排序字段(数字顺序是“应该”,而不是“必须”)
- 包括或省略零(proto2 和 proto3 之间不同)
- 打包与顺序“重复”编码
- “地图”通常由某些特定于平台的内置地图/字典类型支持的现实,这些类型通常不定义 order,因此理论上它每次都可以变化
- 实际上并不是真正的问题,但理论上您可以通过包含不必要的零字节组来编码具有任意长度(最多 10 个字节)的 varint;类似于在文本(JSON 等)中说 42、042、0042 和 0000000042 都表示相同的整数;没有人这样做,但是:这将是有效的
推荐阅读
- python - pandas - 在第二个参考数据框中查找最近(但以前)的日期
- php - 必须是数组类型,返回 null Laravel
- java - 如何将bottomnavigationview片段切换到另一个不是菜单项的片段
- visual-studio - 天蓝色函数文件 function.json 在不同的位置
- flutter - 如何在一段时间后取消安排以前安排的本地通知?
- c++ - 如何调用ntoskrnl.exe srand 函数?
- java - 测试@ControllerAdvice NO REST
- ios - 无法分配“字符串??”类型的值 键入“字符串?” 错误
- scala - 使用 fs2 Stream Scala 按顺序处理向队列发送元素
- delphi - 如何检测 Delphi FireMonkey FMX 中的屏幕分辨率变化