一個故事講完哈希洪荒攻擊

生意紅火

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

    快遞一多,爲了取件人方便找到快遞,於是你按照快遞手機號碼的最後兩位數字來給快遞分類,例如尾號爲 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)。

尾聲

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

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

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

-END-


帥地 腳本之家
作者:帥地
來源丨苦逼的碼農
https://mp.weixin.qq.com/s/wT5YR6q07-IvtkyUje4hNw

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章