Protobuf的GetHashCode在任何地方都是一样的吗?

Protobuf的GetHashCode在任何地方都是一样的吗?,hash,protocol-buffers,Hash,Protocol Buffers,我注意到在从.proto文件生成的C#类中有GetHashCode()。为了使篡改数据变得更加困难,我想计算哈希代码并将其与数据一起发送。然后我可以在目的地再次计算散列 我的方法是在proto定义中有一个hash字段,但是在计算hash之前,我将它保留为0,计算它,将它放入并序列化。在目的地,将记住散列,将其设为0,然后计算新的散列以检查完整性 在接收端是JavaScript: 目的地的哈希生成函数会产生相同的结果吗 如果.proto文件被更新为新字段,新类到处生成,旧消息是否会散列到相同的结

我注意到在从
.proto
文件生成的C#类中有
GetHashCode()
。为了使篡改数据变得更加困难,我想计算哈希代码并将其与数据一起发送。然后我可以在目的地再次计算散列

我的方法是在proto定义中有一个hash字段,但是在计算hash之前,我将它保留为0,计算它,将它放入并序列化。在目的地,将记住散列,将其设为0,然后计算新的散列以检查完整性

在接收端是JavaScript:

  • 目的地的哈希生成函数会产生相同的结果吗
  • 如果
    .proto
    文件被更新为新字段,新类到处生成,旧消息是否会散列到相同的结果
我知道MD5,但我认为它需要在二进制文件完成后生成,如果这样做的话,我不能将MD5与数据一起包含


除此之外,我还将进行加密,但为了防止有人试图解密数据,他不能轻易地更改数据的某些部分以欺骗接收者。

不,你不能像那样使用
GetHashCode()
。它不是protobuf概念,而是存在于所有.NET托管类型中。首先,并非每个对象都重写此方法,如果不重写,则对于类,它表示引用/实例,而不是内容(就像默认情况下
等于
)。如果它被覆盖,那么它在同一应用程序域中每次都会产生相同的值,但不要求它在不同的运行中产生相同的值。这取决于实现和使用的确切框架(假设使用了
string.GetHashCode

但另一个问题是目标框架中的代码将没有匹配方法,即使它有:也无法访问类似
string.GetHashCode
的相同实现

所以不:不要把这个用于那个目的。它不会那样做

举一个具体的例子:像
string.GetHashCode
之类的东西会根据操作系统和.NET版本为同一字符串生成不同的值。它甚至不能完全在.NET端点上实现您想要的功能

作为一个简单的例子,请考虑:

static void Main()
{
    Console.WriteLine("abc".GetHashCode());
    Console.WriteLine("abc".GetHashCode());
    Console.WriteLine("abc".GetHashCode());
}
如果我运行一次,我会得到:

518228267
518228267
518228267
因此,您可能会认为“啊,是的,
GetHashCode()
每次都给出相同的值”。然而,它比这更微妙。在最新版本的.NET上,这是应用程序启动时的种子,因此如果我再次运行它,我会得到:

-177712234
-177712234
-177712234
然后

这部分是为了避免人们在运行时依赖于<代码> GethAhShEd()/<代码>,部分地防止人们使用已知的具有攻击向量的相同哈希代码的集合来强调字典(强迫他们使用回退行为)。-例如,针对web服务器的DDOS攻击。如果哈希不能被静态外部代码预测,则该攻击向量消失。
-59760352
-59760352
-59760352