如果一名程序员想要接触信息安全的话,哈希洪水攻击我是一定会重点圈出来的。一方面是因为它的原理非常简单,只要掌握一点数据结构方面的基本知识就能理解;另一方面是因为,它是我入坑以来对我启发最大的技术之一,从中不仅可以学到一项具体的攻击技术,还可以看到“软件开发从业人员”和“信息安全从业人员”之间决定性的分野。
比较遗憾的是,国内互联网上真正搞懂这项攻击的人不多。虽然有几篇不错的文章讲清了它的攻击原理,但他们给出的防御手段也不过是“限制参数个数”、“禁止不明用户提交数据”之类的东西,无法从根本上解决哈希洪水攻击。所以我才决定这几天抽时间写篇长文回答,讲讲哈希洪水攻击的攻与防。
顺便一提,我没记错的话,阿里还曾经拿这个问题做过面试题,这个选题可以说是很有品味了。
0x01 哈希洪水攻击的成因
哈希洪水攻击(Hash-Flooding Attack)是一种拒绝服务攻击(Denial of Service),一旦后端接口存在合适的攻击面,攻击者就能轻松让整台服务器陷入瘫痪。
那么,所谓的“合适的攻击面”到底指什么呢?我们先来复习一下本科水平的数据结构知识吧。
在各种常用的数据结构里,有些数据结构的“平均运行时间”和“最差运行时间”会差很远,比如哈希表(Hash Table)。假设我们想要连续插入 个元素到哈希表中:
- 如果这些元素的键(Key)极少出现相同哈希值,这项任务就只需 的时间。
- 如果这些键频繁出现相同的哈希值(频繁发生碰撞),这项任务就需要 的时间。
这应该是每个学过数据结构的学生都知道的常识,不过大部分人看过之后就很快忘掉了。
2003年,Scott A. Crosby 和 Dan S. Wallach 两位研究人员发表了一篇论文:

本文深入解析哈希洪水攻击,探讨其原理如何利用数据结构弱点,以及如何通过改进哈希算法和使用密钥哈希来防御。还提及了Java和Google等的解决方案。
最低0.47元/天 解锁文章
1867





