1. 程式人生 > >大白話瞭解雜湊洪荒攻擊

大白話瞭解雜湊洪荒攻擊

生意紅火

有一天你和你的鄰居同時開了一個快遞驛站,不過你的運氣很好,每天都有很多快遞到你這裡來,生意紅紅火火,然而,你的鄰居生意很冷清。

快遞一多,為了取件人方便找到快遞,於是你按照快遞手機號碼的最後兩位數字來給快遞分類,例如尾號為 01 的放到櫃子 1 中,尾號為 02 的放到櫃子 2 。如果有人來取快遞,他只需要報出他的手機號碼,就可以快速找到對應的櫃子,然後再根據完整的手機號碼在這個櫃子裡找到對應的快件了。

 

心聲惡意的鄰居

日子一天天過去,你的店鋪越來越火,然而,你鄰居的生意冷清到哭暈在廁所裡,但是你並沒有去在意你的鄰居,也沒有分擔點生意給他,於是,你的鄰居心生壞意,決定搞搞你。

他知道你是採用按照快件手機號碼末尾兩位來分類的,於是他分批買了大量非常廉價的物品,並且把大部分快遞的手機號碼的末尾的兩位弄成是一樣的。

於是,你收到了大量的快遞,並且大量的快遞都被分到了同一個櫃子裡,導致有些櫃子裡堆放了大量的快件,擠滿到不得不把一些放地下了,然而有些櫃子裡卻是空蕩蕩的。

這也不僅導致了資源分配不均勻,每次顧客來取快件的時候,還得找好久才能找到。

於是你老爸和你說:要不加大櫃子的容量吧。

你:加大容量沒用,雖然能短暫不會出現擠滿放地下的情況,但本質問題並沒有解決。

 

更換策略

為了解決這個問題,於是你採取了別的策略,把手機號碼當做一個數值,然後對這個數值進行取餘,例如 手機號 % 99 = 櫃子的編號。

每次客人來的時候,你把他的手機號碼也進行取餘,然後告訴他,去對應的櫃子取,取餘這個操作雖然麻煩了點,工作量比之前大了,但,躲開了你鄰居的攻擊,也算值得。

 

問題的本質

然而好景不長,你的鄰居通過觀察與測試,發現你是通過手機號碼取餘來對映到對應的櫃子上的,於是,它又找了一堆手機號碼取餘後值相同的手機號碼來搞定,於是,你又奔潰了。

你知道你侄子是學計算機專業的,於是你把這件事告訴了你的侄子,你的侄子一聽到這個,就來了勁,於是管不住嘴吹了下面這一大堆:

告訴你,你的這種對映策略相當於我平時學的雜湊演算法,不管你如何改變你的演算法策略,只要被別人知道了你的雜湊演算法,那麼,都會容易遭受到別人的攻擊,像你的鄰居的那種攻擊方式,就叫做雜湊洪荒攻擊。

我們都知道,在各種資料結構裡,有平均時間複雜度和最差時間複雜度之分,對於雜湊演算法,我們插入 n 個到元素到數組裡的話,平均時間複雜度是 O(n),而最差的時間複雜度是 O(n^2);查詢某個元素的平均複雜度是 O(1),最差時間複雜度是 O(n),而雜湊洪荒攻擊就是攻擊者有意給出一些特殊值,使得我們每次都遇到了最差時間複雜度。

 

如何防禦?

剛才說了,雜湊洪荒攻擊的本質就是攻擊者掌握了你的雜湊演算法,所以如何想要防禦的話,就需要我們設計出優秀的雜湊演算法了,什麼才算優秀的雜湊演算法?

1、映射出來的雜湊碼分佈均勻。

2、不容易被破解。

當然,不管你如何設計,一旦攻擊者掌握了你的演算法細節,那麼你都得涼。

 

那有沒有比較好的防禦措施呢?

其實,我們可以通過生成一些隨機值來加強我們的雜湊演算法,例如,我們每次建立一張雜湊表的時候,我們就隨機生成一個新的隨機值,來作為雜湊演算法的一部分。這樣一來,即使是同樣的內容,放在不同的表裡也會產生完全不同的雜湊碼。

這樣一來,攻擊者就很難進行預測了,即使發生了碰撞,也是小概率的巧合,而不是攻擊者在主動控制,我們也把這個隨機的值稱之為雜湊種子(Hash Seed)。而這類使用雜湊種子的雜湊演算法,我們稱之為帶金鑰雜湊演算法(Keyed Hash Function)。

當然,上面這種方式只是防禦雜湊洪荒攻擊的一種方式,對於雜湊碰撞,在面試中問的最多的應該就是 Java 中的雜湊表了,我跟大家補充講講 Java8 中是如何解決雜湊碰撞的吧。

Java 中的雜湊表如果出現了雜湊衝突,就會用一個連結串列來存放雜湊碼相同的元素,但是如果出現大量雜湊碼相同的話,那麼大量的元素都放在了同一條連結串列裡,這樣會導致雜湊表的查詢時間複雜度是 O(n),為了解決這個問題,當連結串列中的元素大於等於 8 的時候,就把用紅黑樹來取代連結串列,這樣一來,可以把最差時間複雜度控制在 O(logn)。

 

尾聲

你侄子吹了一大堆專業名詞,對於只讀過小學的你,想不懵逼都難,這個時候你憋不住了,拋了一句給你侄子:能不能講點人話?你只需要告訴我,我該怎麼做就行了。

你侄子:我來去給你設計一個程式吧,你到時候只需要把你的手機號碼進去就可以了,它會把你自動映射出對應的櫃子。

最後,鄰居把店鋪拆了,開了一家網咖…..

 

原文來自:http://netsecurity.51cto.com/art/201905/597217.htm

 

本文地址:https://www.linuxprobe.com/hashihong-desert-attack.html編輯:馮瑞濤,稽核員:逄增寶

 

Linux命令大全:https