C# object.GetHashCode 的 .net 实现中是否存在任何漏洞?

信息安全 哈希 拒绝服务 。网 Python
2021-08-24 01:40:11

我已经在 SO 上问过这个问题,但我认为这个论坛更适合讨论安全问题。

我的观点是,大多数 OO 语言都有办法为对象获取唯一的哈希码:

  • Python: obj.__hash__()
  • 爪哇: obj.hashCode()
  • 。网: obj.GetHashCode()

众所周知,对于 Python,拒绝服务漏洞来自原始大会的pdf )自3.30版以来已通过种子随机化(即使它不适用于单窗口解释器)得到解决。

我的问题是为什么在 .Net 哈希的默认实现中忽略了这个问题?从安全的角度来看,正确的方法是什么:不应该向 .Net 框架团队开发人员建议相同的种子随机化吗?

1个回答

列出的散列方法(由公共对象提供以符合标准集合使用的接口的方法)的目的是将计算散列的所有可能值映射到散列值类型的有效值的全部范围。此映射中使用的随机性不是为了安全。映射必须足够随机,以便序列和常见模式不会导致在使用基于散列的集合通用的桶时分布不均匀。

散列映射、多映射和集合可用于更大的安全方案,但它们本身并不安全。它们只是旨在提供索引查找的集合。以这种方式使用的哈希提供比二叉树更快的索引。

术语 hashCode 实际上以这种方式具有误导性。为字符串类型创建哈希以便可以使用这样的字符串对哈希映射进行索引不是一种编码。这种散列算法产生的散列值可能会映射回大量对象值,但在此上下文中的目的不是要对攻击者隐藏这些对象值。

对于安全协议中使用的 MD5 或 SHA 哈希算法,其目的是在任何实际可实现的尝试次数中创建从哈希中猜测输入值的数学上低概率。这些语言中的通用对象提供的方法,以便它们可以插入到使用存储桶索引它们的集合中,绝不应该使用这些方法来替代设计用于安全协议的哈希算法。