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