一、什么是哈希洪水攻擊
哈希洪水攻擊(Hash-Flooding Attack)是一種拒絕服務攻擊(Denial of Service),一旦后端接口存在合適的攻擊面,攻擊者就能輕松讓整臺服務器陷入癱瘓。。洪水攻擊同時也是信息安全領域,最值得研究的課題之一。
哈希洪水攻擊原理
我們知道,在常用的數據結構里,有些數據結構的“平均運行時間”和“最差運行時間”差得很多,比如哈希表。
如果想連續插入多個元素到哈希表中,假定這些元素的鍵很少出現相同的哈希值,平均運行時間較少,但如果頻繁出現相同的哈希值,所需要的時間就會成倍的增加。
基于這一現象,有人突發奇想,既然“最差運行時間”和“平均運行時間”可以差距那么大,我們是不是可以找到一種方法,使該算法一直使用最差運行時間運行,進而占用大量服務器資源,以最小的代價促使服務器癱瘓?
還真可以實現!
2011年有人曾經做過一次實驗,攻擊一臺基于Java(Tomcat)的服務器時,只需要6kb/s的流量,就可以癱瘓Intel i7處理器。成本如此之低令人發指。
如果你還不明白哈希洪水攻擊,我們可以通過一個簡單的例子,進一步了解。
假設A在經營一家菜鳥驛站,那時候的菜鳥驛站,還沒有快件管理系統,A只能自己制定策略管理快件。
A很快想到了一個辦法,以客戶手機號的尾數作為判斷條件,對快件進行分類整理。比如手機尾號為75的的快遞,就放在7號貨架的第5層上。
由于經營有方,A的菜鳥驛站的生意越來越好。
然而,快遞不配送到家,引起了顧客B的不滿,A和B經常為此鬧得十分不愉快。B決定狠狠報復一下。
經過一段時間的觀察,B發現菜鳥驛站的快遞分類方法的規律。于是B聯合自己的小伙伴,去申請了大量以7x結尾的手機號,并利用這些手機號在網上進行刷單,產生大量的空包裹。
很快,7號貨架被這些“惡意”快遞占滿,那些以7x結尾的正常客戶取快遞的時間越來越長,顧客滿意度直線下降,A所經營的菜鳥驛站經常遭到投訴,生意越來越差。
最終,因為人手不夠,無法及時處理這些快遞,A的菜鳥驛站最終關門歇業。
以上就是哈希洪水攻擊的過程。
防御哈希洪水攻擊
哈希洪水攻擊實在過于簡單粗暴,那有沒有什么辦法防御這類攻擊呢?
有!
通過菜鳥驛站這個例子,我們很容易想到兩種方法。
名列前茅種是限制參數個數,每個貨架上能放多少包裹都是固定的,只有老包裹被取走,新包裹才能放上去。
第二種是想一套策略,禁止不明用戶提交數據,你這個包括掂起來空空的,有可能是刷單的包裹,對不起,不能放在貨架上。
理論上這些方法都可以有效防止哈希洪水攻擊,但沒辦法從根本上杜絕這類攻擊。
有人想到了一種絕妙的方法,既然B很容易就能猜到A管理快遞的規則,那么我們對規則進行加密,不就可以防止哈希洪水攻擊的發生嗎?
只要我們每建一個哈希表,就隨機生成一個新的秘密參數。這樣一來,即使相同的內容,放在不同的表里也會產生完全不同的內存分配。
這一過程,黑客無法預測,也就無法發動攻擊。
設計更加安全的帶密鑰的哈希算法,使黑客難以繞過,發動攻擊。
延伸閱讀:
二、哈希表概述
哈希表的哈希函數輸入一個鍵,并向返回一個哈希表的索引。可能的鍵的集合很大,但是哈希函數值的集合只是表的大小。
哈希函數的其他用途包括密碼系統、消息摘要系統、數字簽名系統,為了使這些應用程序按預期工作,沖突的概率必須非常低,因此需要一個具有非常大的可能值集合的散列函數。
密碼系統:給定用戶密碼,操作系統計算其散列,并將其與存儲在文件中的該用戶的散列進行比較。(不要讓密碼很容易被猜出散列到相同的值)。
消息摘要系統:給定重要消息,計算其散列,并將其與消息本身分開發布。希望檢查消息有效性的讀者也可以使用相同的算法計算其散列,并與發布的散列進行比較。(不要希望偽造消息很容易,仍然得到相同的散列)。