Rust 为什么Serde不能用于Libra';s加密目的的序列化和反序列化?

Rust 为什么Serde不能用于Libra';s加密目的的序列化和反序列化?,rust,cryptography,serde,Rust,Cryptography,Serde,在天秤座,参与者传递信息或数据结构,这些信息或数据结构通常需要由验证人签名,并由一个或多个验证人验证。在此上下文中,序列化是指将消息转换为字节数组的过程。许多序列化方法支持松散的标准,因此两个实现可以生成两个不同的字节流,表示相同的消息。对于许多应用程序,非确定性序列化不会导致任何问题,但对于出于加密目的而使用序列化的应用程序,非确定性序列化会导致任何问题。例如,给定签名和消息,当验证人对消息进行签名时,验证人可能无法生成验证人构建的相同序列化字节数组,从而生成不可验证的消息。换句话说,为了确保

在天秤座,参与者传递信息或数据结构,这些信息或数据结构通常需要由验证人签名,并由一个或多个验证人验证。在此上下文中,序列化是指将消息转换为字节数组的过程。许多序列化方法支持松散的标准,因此两个实现可以生成两个不同的字节流,表示相同的消息。对于许多应用程序,非确定性序列化不会导致任何问题,但对于出于加密目的而使用序列化的应用程序,非确定性序列化会导致任何问题。例如,给定签名和消息,当验证人对消息进行签名时,验证人可能无法生成验证人构建的相同序列化字节数组,从而生成不可验证的消息。换句话说,为了确保在使用非确定性序列化时消息的可验证性,参与者必须保留原始序列化字节,否则就有可能失去验证消息的能力。这就造成了一个负担,要求参与者同时维护序列化字节和反序列化消息的副本,这通常会导致对安全性和正确性的混淆。虽然存在少量现有的确定性序列化格式,但没有明显的选择。为了解决这个问题,我们提出了Libra规范序列化,它定义了将消息转换为字节的确定性方法


就是。什么是真正的确定性序列化?如果serde不是确定性的,那么它如何在序列化数据结构后反序列化回去?

HashSet
HashMap
可以将项目插入不同的插槽,具体取决于插入、更新和删除的确切顺序。这些数据结构的序列化程序按插槽顺序运行,发出一系列(键、值)对。由于插槽顺序是不确定的,因此序列化的字节将是不确定的。

Serde是一个序列化库,但不是数据到字节的特定转换。Serde支持许多数据格式和序列化程序,其中一些是确定性的。事实上,Libra的最新版本似乎已经放弃了定制的规范序列化库,转而支持。所以我认为你的问题的前提,即Serde不能在Libra中用于加密目的,是不正确的。非确定性序列化的例子:
{“a”:1,“b”:2}
{“b”:2,“a”:1}
在JSON中是等效的、明确的,但是序列化的数据是不同的。@kmdreko这是数据格式中冗余的一个例子——但是如果序列化程序总是为等效输入生成相同的数据,它仍然是确定的。更准确的说法是,
serde_json
序列化程序
是一个非确定性序列化程序的示例,因为它不这样做。@trentcl是的,是使其具有确定性的过程,而不一定是格式。这个例子是为了说明非确定性输出如何仍然可以成功地反序列化;OP似乎不确定。序列化程序可以按插槽顺序操作,但它们不必按收到的顺序序列化条目。完全可以确定地序列化
HashMap
。决定论是序列化的属性,而不是数据结构。是的,这是可能的,但它们通常不会这样做。所涉及的性能时间和空间损失将与此类序列化程序的典型性能设计目标相冲突。