前記html
MD5的全稱是Message-Digest Algorithm 5(信息-摘要算法);算法
特色是不可逆的,通常解密不了;那有沒有想過,爲何各類工具網站均可以進行MD5解密呢?https://www.sojson.com/encrypt_md5.html數據庫
彩虹表,瞭解一下。編程
密碼存儲有幾種方式:json
若是數據庫被入侵。
第一方式,明文存儲,無安全性可言。
第二種方式,雖然是入侵者獲得的是hash值,但因爲彩虹表的存在,也很容易批量還原出密碼明文來。
只有第三種方式纔是相對安全的。安全
要從c=hash(m)逆向獲得原始明文m,有三種辦法:函數
既然存儲全部的明文密碼對須要的空間太大,密碼學家們想出了一種以計算時間下降存儲空間的辦法:「預計算的哈希鏈集」(Precomputed hash chains)。
這是一條k=2哈希鏈:工具
H函數就是要破解的哈希函數。
約簡函數(reduction function)R函數是構建這條鏈的時候定義的一個函數:它的值域和定義域與H函數相反。經過該函數能夠將哈希值約簡爲一個與原文相同格式的值。
這條鏈是這樣生成的:網站
以大量的隨機明文做爲起節點,經過上述步驟計算出哈希鏈並將終節點進行儲存,可獲得一張哈希鏈集。加密
要破解一個hash值,
對於一個長度爲k的預計算的哈希鏈集,每次破解計算次數不超過k,所以比暴力破解大大節約時間。
每條鏈只保存起節點和末節點,儲存空間只需約1/k,於是大大節約了空間。
要發揮預計算的哈希鏈集的左右,須要一個分佈均勻的R函數。當出現碰撞時,就會出現下面這種狀況
111 --H--> EDEDED --R--> 222 --H--> FEDEFE --R--> 333 --H--> FEFEDC --R--> 444
454 --H--> FEDECE --R--> 333 --H--> FEFEDC --R--> 444 -H--> FEGEDC --R--> 555
兩條鏈出現了重疊。這兩條哈希鏈能解密的明文數量就遠小於理論上的明文數2×k。因爲集合只保存鏈條的首末節點,所以這樣的重複鏈條並不能被迅速地發現。
彩虹表的出現,針對性的解決了R函數致使的鏈重疊問題:
它在各步的運算中,並不使用統一的R函數,而是分別使用R1…Rk共k個不一樣的R函數(下劃線表示下標)。
這樣一來,及時發生碰撞,一般會是下面的狀況:
111 --H--> EDEDED --R1--> 222 --H--> FEDEFE --R2--> 333 --H--> FEFEDC --R3--> 444
454 --H--> FEDECE --R1--> 333 --H--> FEFEDC --R2--> 474 -H--> FERFDC --R3--> 909
即便在極端狀況下,兩個鏈條同一序列位置上發生碰撞,致使後續鏈條徹底一致,這樣的鏈條也會由於末節點相同而檢測出來,能夠丟棄其中一條而不浪費存儲空間。
彩虹表的使用比哈希鏈集稍微麻煩一些。
對於哈希鏈集,最大計算次數爲k,平均計算次數爲k/2
彩虹表的最大計算次數爲1+2+3+……k = k(k-1)/2,平均計算次數爲[(k+2) * (k +1)]/6。
可見,要解相同個數的明文,彩虹表的代價會高於哈希鏈集。
不管哈希鏈集仍是彩虹表:
當k越大時,破解時間就越長,但彩虹表所佔用的空間就越小;
相反,k越小時,彩虹表自己就越大,相應的破解時間就越短。
1)常見的彩虹表:http://project-rainbowcrack.com/table.htm
2)R函數舉例:假設明文爲5位數字,則R函數是取哈希值中前5個數字。參見https://crypto.stackexchange.com/questions/5900/example-rainbow-table-generation
能夠本身編程生成彩虹表,也可使用RainbowCrack或Cain等軟件來生成,有興趣的讀者能夠自行百度。彩虹表的生成時間與字符集的大小、哈希鏈的長度成正比,以下圖中「7位密碼、所有字符集、哈希鏈長度爲2萬」的彩虹表大小爲32G,本地生成大約須要332天,而從網上下載只須要2個小時左右,主流的彩虹表的大小廣泛在100G以上,想要本身生成是幾乎不可能的事,所以強烈建議黑客技術愛好者直接從網上下載。
彩虹表確實像它的名字同樣美好,至少黑客眼裏是這樣。上表是7位之內密碼在不一樣字符集下構造出的彩虹表的狀況,彩虹表中哈希鏈的長度和個數隨着字符集的增加而增加,彩虹表的大小和生成時間也隨之成倍增長。7位數字組合在彩虹表面前簡直就是秒破,即便最複雜的7位密碼不到一個小時就能破解,若是採用普通的暴力攻擊,破解時間可能須要三週。
雖然彩虹表有着如此驚人的破解效率,但網站的安全人員仍然有辦法防護彩虹表。最有效的方法就是「加鹽」,即在密碼的特定位置插入特定的字符串,這個特定字符串就是「鹽」,加鹽後的密碼通過哈希加密獲得的哈希串與加鹽前的哈希串徹底不一樣,黑客用彩虹表獲得的密碼根本就不是真正的密碼。即便黑客知道了「鹽」的內容、加鹽的位置,還須要對H函數和R函數進行修改,彩虹表也須要從新生成,所以加鹽能大大增長利用彩虹表攻擊的難度。
彩虹表在生成的過程當中,針對的是特定的函數H,H若是發生了改變,則已有的彩虹表數據就徹底沒法使用。若是每一個用戶都用一個不一樣的鹽值,那麼每一個用戶的H函數都不一樣,則必需要爲每一個用戶都生成一個不一樣的彩虹表。大大提升了破解難度。