【问题标题】:Why does Data.HashTable use hashing with salt (from Data.Hashable)?为什么 Data.HashTable 使用盐散列(来自 Data.Hashable)?
【发布时间】:2014-07-13 17:18:49
【问题描述】:

我不明白为什么 Data.HashTable 使用 Data.Hashable ,它具有 hashWithSalt 作为(唯一/基本)方法。

这不符合计算哈希值一次并将其存储在对象中的自然优化(自然,因为 Haskell 对象是不可变的)。

如果我想使用HashTables,那么我不得不实现hashWithSalt。 (从 1.2.0.* 到 1.2.1.*,hashable 重新引入了hash 作为类方法,但这并没有帮助?)

实际的 Table 实现似乎没有使用 hashWithSaltHashTable.ST.Linear 根本没有,HashTable.ST.Cuckoo 仅使用两个固定盐)。

【问题讨论】:

  • 你在看什么包? hackage.haskell.org/package/base-4.5.1.0/docs/… 根本不使用 Hashable
  • 不能按照hash 来实现hashWithSalt 吗? cuckoo 版本可能不起作用,但其他哈希表会。
  • 哈希表使用带盐的哈希的原因是为了在攻击者可以控制插入表中的密钥时减轻哈希冲突 DoS 攻击。当然,他们应该使用特定于站点的盐而不是图书馆固定的盐..
  • @dfeuer: Data.HashTable 在 base-4.6 中,但与 base-4.7 分开我正在查看 hackage.haskell.org/package/hashtables-1.1.2.1
  • @d8d0d65b3f7cf42 确实如此。每当您运行与外界交互的服务时,您都需要注意潜在的攻击。一个众所周知的(或者我认为)攻击是对用于存储攻击者提供的密钥的哈希表的冲突攻击。这是一种拒绝服务攻击,它通过强制每个键进入同一个哈希桶来使进程过载,从而导致对每次插入时已经存在的键进行线性时间检查。

标签: haskell hashable


【解决方案1】:

正如 Carl 在 cmets 中指出的那样,转移到 hashWithSalt 方法而不是 hash(就像原来的 Hashable 使用的那样)是为了允许人们减轻基于哈希冲突的 DOS 攻击。在一段时间内,每次运行都会生成不同的随机默认盐,甚至在后台使用unsafePerformIO。然而,对于那些对例如跨运行保持数据结构,获得可靠的基准测试数据等。

因此,当前的方法是提供该方法,但倾向于遵循固定的默认盐,然后在文档中添加一个警告,如果在公共环境中使用它仍然容易受到各种潜在的 DOS 攻击向量的影响——面对方式。 (您可以在此处的文档中亲自查看:http://hackage.haskell.org/package/hashable-1.2.1.0/docs/Data-Hashable.html

因为hash 是它自己的类方法,所以很容易实现一个带有“无盐”哈希的对象,而且,你可以像xoring 一样实现hashWithSalt如果你愿意,可以加盐。或者,正如 cmets 所指出的,您可以通过更合法的 hashing 生成/备忘录 hash 方法来实现 hashWithSalt

【讨论】:

    猜你喜欢
    • 2011-07-30
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    相关资源
    最近更新 更多