为什么HashMap需要加密安全的哈希函数?

时间:2018-09-05 11:44:54

标签: hashmap rust hash-function

我正在读一本有关HashMap hashing functions的Rust书,我听不懂这两个句子。

  

默认情况下,HashMap使用一种加密安全的哈希函数,该函数可以抵抗拒绝服务(DoS)攻击。这不是可用的最快的哈希算法,但是值得在性能下降的同时进行权衡以获取更好的安全性。

我知道什么是加密安全的哈希函数,但我不了解其背后的原理。据我了解,HashMap的良好哈希函数应仅具有三个属性:

  • 确定性的(同一对象具有相同的哈希值)
  • 很快,
  • 哈希值中的比特均匀分布(这将减少冲突)

在具有加密安全性的哈希函数中,其他属性与哈希表的使用时间实际上不相称99%(甚至99.99%)。

所以我的问题是:“抵抗DoS攻击和更好的安全性是什么? ”甚至在HashMap的上下文中意味着什么?

3 个答案:

答案 0 :(得分:9)

让我们从头开始:如何对HashMap进行DoS?

这些年来,基于Hash Flooding的各种软件堆栈遭受了多次攻击。如果您知道网站由哪个框架提供支持,并因此使用了哪个哈希函数,并且该哈希函数在密码学上不安全,那么您也许可以离线预先计算大量的字符串散列到相同的数字。

然后,您只需将此集合注入到站点中,并且对于每个(简单)请求,由于插入N个元素需要进行O(N 2 )操作,因此它会进行大量的工作。 / p>


考虑到事后观察的好处,所以锈病得到了考虑,因此,要注意避免默认情况下 发生这种攻击,理由是真正需要性能的用户HashMap会简单地切换哈希功能。

答案 1 :(得分:3)

比方说,我们使用HashMap在Web应用程序中存储一些用户数据。 假设用户可以通过某种方式选择(部分)密钥 –也许密钥是上载文件的用户名或文件名或类似的名称。

如果我们不使用加密安全的哈希函数,则意味着攻击者可能设计多个都映射到同一输出的输入。当然,哈希映射必须处理冲突,因为它们是自然发生的。

但是,当发生不自然的许多冲突时,哈希映射实现可能会做一些奇怪的事情。例如,查找某些键可能具有 O(n)运行时间。否则,哈希映射可能会认为由于所有冲突而必须增长;但增长并不能解决问题,因此哈希映射增长直至使用完所有内存。无论哪种情况,这都是不好的。哈希图只是假设从统计上讲,很少发生冲突。

当然,这不是“窃取用户数据”攻击-至少不是直接的。但是,如果系统的某个部分很弱,那么攻击者就更容易发现其他弱点。

密码安全的哈希函数可防止此攻击,因为攻击者无法制作映射到同一值的多个密钥(至少在没有尝试所有密钥的情况下如此)。


  

与哈希表在99%的时间(甚至99.99%)中没有真正的关联。

是的,可能。但这很难平衡。我猜我们都同意,如果20%的用户由于不安全的哈希函数而在应用程序中遇到安全问题(而80%的用户不在乎),那么使用“默认安全”方法还是一个好主意。 5%/ 95%呢? 1%/ 99%呢?很难说阈值在哪里,对吧?

已经对此进行了大量讨论。因为是的,所以大多数人只注意到哈希图的缓慢性。也许我上面描述的情况非常罕见,并且默认情况下不应该放慢所有其他用户的代码。但这已经确定,默认的哈希函数不会改变,幸运的是您可以选择自己的哈希函数。

答案 2 :(得分:2)

如果服务器应用程序将用户输入(例如Web应用程序中的发布数据)存储在哈希表中,则恶意用户可能会尝试提供大量具有相同哈希值的输入,从而导致大量输入散列冲突,从而大大降低了地图上的操作速度,以至于可以将其用作DoS攻击(例如this article中所述)。

如果哈希是加密安全的,攻击者将很难找到具有相同哈希值的输入。