hashdos
近一个月前,我就如何在不与供应商互动的情况下临时
解决 28C3上出现的
HashDoS问题或其他代码缺陷发表了一些想法。
现在是时候更深入地研究复杂性攻击并查看源了。 我完全假设java.util.HashMap和java.util.Hashtable是受此攻击影响的最常用的Java数据结构,因此本文仅将代码集中在这些类型的后面。
哈希函数和索引数据结构的简要介绍
哈希索引数据结构因其简单的用法和优点而非常受欢迎:
- 无需打扰索引表即可找到所需数据的正确位置
- 通过使用关键字而不是索引号访问数据
- 添加或删除操作的时间几乎恒定
为了获得这些好处,哈希索引数据结构遵循有关如何索引数据的聪明思想。 索引是通过散列与背后数据关联的关键字来计算的。 考虑以下示例,这是一个类似于代码的简单示例:
myHashIndexedDataStructure [hash(keyword)] =特定数据
听起来很完美,但是它有一个主要缺点:在大多数情况下,使用的哈希函数不是加密函数。
根据Wikipedia的说法,函数本身调用哈希函数的唯一强制特征是
“将可变长度的大型数据集(称为键)映射到固定长度的较小数据集”
与称自己为密码哈希函数(再次是来自Wikipedia的定义)相反,它必须满足更多,甚至更强大的要求:
”
- 计算任何给定消息的哈希值很容易(但不一定很快)
- 生成具有给定哈希值的消息是不可行的
- 在不更改哈希的情况下修改消息是不可行的
- 找到两个具有相同哈希值的不同消息是不可行的
”
长话短说,让我们总结一下我们学到的知识以及用这些知识可以得出的结论:
- 哈希索引数据结构利用哈希函数
- 哈希函数不一定是抗冲突的,只要它们不是加密的
- 缺乏抗碰撞性意味着可以轻松计算具有相同哈希值的多个值
如果关键字冲突,则哈希索引数据结构需要某种计划b)–一种后备算法–关于如何处理具有相同关键字哈希值的多个数据集。
实际上,有几种可行的方法:
- 探测(转移到固定或可计算的间隔)
- 多重哈希
- 条目链接ÿ