生意紅火html
有一天你和你的鄰居同時開了一個快遞驛站,不過你的運氣很好,天天都有不少快遞到你這裏來,生意紅紅火火,然而,你的鄰居生意很冷清。linux
快遞一多,爲了取件人方便找到快遞,因而你按照快遞手機號碼的最後兩位數字來給快遞分類,例如尾號爲 01 的放到櫃子 1 中,尾號爲 02 的放到櫃子 2 。若是有人來取快遞,他只須要報出他的手機號碼,就能夠快速找到對應的櫃子,而後再根據完整的手機號碼在這個櫃子裏找到對應的快件了。面試
心聲惡意的鄰居算法
日子一每天過去,你的店鋪愈來愈火,然而,你鄰居的生意冷清到哭暈在廁所裏,可是你並無去在乎你的鄰居,也沒有分擔點生意給他,因而,你的鄰居心生壞意,決定搞搞你。數組
他知道你是採用按照快件手機號碼末尾兩位來分類的,因而他分批買了大量很是廉價的物品,而且把大部分快遞的手機號碼的末尾的兩位弄成是同樣的。數據結構
因而,你收到了大量的快遞,而且大量的快遞都被分到了同一個櫃子裏,致使有些櫃子裏堆放了大量的快件,擠滿到不得不把一些放地下了,然而有些櫃子裏倒是空蕩蕩的。測試
這也不只致使了資源分配不均勻,每次顧客來取快件的時候,還得找很久才能找到。設計
因而你老爸和你說:要不加大櫃子的容量吧。htm
你:加大容量沒用,雖然能短暫不會出現擠滿放地下的狀況,但本質問題並無解決。資源
更換策略
爲了解決這個問題,因而你採起了別的策略,把手機號碼當作一個數值,而後對這個數值進行取餘,例如 手機號 % 99 = 櫃子的編號。
每次客人來的時候,你把他的手機號碼也進行取餘,而後告訴他,去對應的櫃子取,取餘這個操做雖然麻煩了點,工做量比以前大了,但,躲開了你鄰居的攻擊,也算值得。
問題的本質
然而好景不長,你的鄰居經過觀察與測試,發現你是經過手機號碼取餘來映射到對應的櫃子上的,因而,它又找了一堆手機號碼取餘後值相同的手機號碼來搞定,因而,你又奔潰了。
你知道你侄子是學計算機專業的,因而你把這件事告訴了你的侄子,你的侄子一聽到這個,就來了勁,因而管不住嘴吹了下面這一大堆:
告訴你,你的這種映射策略至關於我平時學的哈希算法,無論你如何改變你的算法策略,只要被別人知道了你的哈希算法,那麼,都會容易遭受到別人的攻擊,像你的鄰居的那種攻擊方式,就叫作哈希洪荒攻擊。
咱們都知道,在各類數據結構裏,有平均時間複雜度和最差時間複雜度之分,對於哈希算法,咱們插入 n 個到元素到數組裏的話,平均時間複雜度是 O(n),而最差的時間複雜度是 O(n^2);查找某個元素的平均複雜度是 O(1),最差時間複雜度是 O(n),而哈希洪荒攻擊就是攻擊者有意給出一些特殊值,使得咱們每次都遇到了最差時間複雜度。
如何防護?
剛纔說了,哈希洪荒攻擊的本質就是攻擊者掌握了你的哈希算法,因此如何想要防護的話,就須要咱們設計出優秀的哈希算法了,什麼纔算優秀的哈希算法?
一、映射出來的哈希碼分佈均勻。
二、不容易被破解。
固然,無論你如何設計,一旦攻擊者掌握了你的算法細節,那麼你都得涼。
那有沒有比較好的防護措施呢?
其實,咱們能夠經過生成一些隨機值來增強咱們的哈希算法,例如,咱們每次創建一張哈希表的時候,咱們就隨機生成一個新的隨機值,來做爲哈希算法的一部分。這樣一來,即便是一樣的內容,放在不一樣的表裏也會產生徹底不一樣的哈希碼。
這樣一來,攻擊者就很難進行預測了,即便發生了碰撞,也是小几率的巧合,而不是攻擊者在主動控制,咱們也把這個隨機的值稱之爲哈希種子(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://www.linuxcool.com/