做者:張輝算法
blog.csdn.net/ctrip_tech/article/details/80125741數據庫
做爲互聯網公司的信息安全從業人員常常要處理撞庫掃號事件,產生撞庫掃號的根本緣由是一些企業發生了信息泄露事件,且這些泄露數據未加密或者加密方式比較弱,致使黑客能夠還原出原始的用戶密碼。編程
目前已經曝光的信息泄露事件至少上百起,其中包括多家一線互聯網公司,泄露總數據超過10億條。安全
要徹底防止信息泄露是很是困難的事情,除了防止黑客外,還要防止內部人員泄密。但若是採用合適的算法去加密用戶密碼,即便信息泄露出去,黑客也沒法還原出原始的密碼(或者還原的代價很是大)。服務器
也就是說咱們能夠將工做重點從防止泄露轉換到防止黑客還原出數據。下面咱們將分別介紹用戶密碼的加密方式以及主要的破解方法。微信
1、用戶密碼加密
用戶密碼保存到數據庫時,常見的加密方式有哪些,咱們該採用什麼方式來保護用戶的密碼呢?如下幾種方式是常見的密碼保存方式:app
一、直接明文保存,好比用戶設置的密碼是「123456」,直接將「123456」保存在數據庫中,這種是最簡單的保存方式,也是最不安全的方式。但實際上很多互聯網公司,均可能採起的是這種方式。學習
二、使用對稱加密算法來保存,好比3DES、AES等算法,使用這種方式加密是能夠經過解密來還原出原始密碼的,固然前提條件是須要獲取到密鑰。不過既然大量的用戶信息已經泄露了,密鑰極可能也會泄露,固然能夠將通常數據和密鑰分開存儲、分開管理,但要徹底保護好密鑰也是一件很是複雜的事情,因此這種方式並非很好的方式。加密
三、使用MD五、SHA1等單向HASH算法保護密碼,使用這些算法後,沒法經過計算還原出原始密碼,並且實現比較簡單,所以不少互聯網公司都採用這種方式保存用戶密碼,曾經這種方式也是比較安全的方式,但隨着彩虹表技術的興起,能夠創建彩虹表進行查表破解,目前這種方式已經很不安全了。url
四、特殊的單向HASH算法,因爲單向HASH算法在保護密碼方面再也不安全,因而有些公司在單向HASH算法基礎上進行了加鹽、屢次HASH等擴展,這些方式能夠在必定程度上增長破解難度,對於加了「固定鹽」的HASH算法,須要保護「鹽」不能泄露,這就會遇到「保護對稱密鑰」同樣的問題,一旦「鹽」泄露,根據「鹽」從新創建彩虹表能夠進行破解,對於屢次HASH,也只是增長了破解的時間,並無本質上的提高。拓展:驗證碼及登陸中的漏洞分析
五、PBKDF2算法,該算法原理大體至關於在HASH算法基礎上增長隨機鹽,並進行屢次HASH運算,隨機鹽使得彩虹表的建表難度大幅增長,而屢次HASH也使得建表和破解的難度都大幅增長。使用PBKDF2算法時,HASH算法通常選用sha1或者sha256,隨機鹽的長度通常不能少於8字節,HASH次數至少也要1000次,這樣安全性才足夠高。
一次密碼驗證過程進行1000次HASH運算,對服務器來講可能只須要1ms,但對於破解者來講計算成本增長了1000倍,而至少8字節隨機鹽,更是把建表難度提高了N個數量級,使得大批量的破解密碼幾乎不可行,該算法也是美國國家標準與技術研究院推薦使用的算法。
六、bcrypt、scrypt等算法,這兩種算法也能夠有效抵禦彩虹表,使用這兩種算法時也須要指定相應的參數,使破解難度增長。
下表對比了各個算法的特性:
2、用戶密碼破解
用戶密碼破解須要針對具體的加密方式來實施,若是使用對稱加密,而且算法足夠安全(好比AES),必須獲取到密鑰才能解密,沒有其它可行的破解方式。
若是採用HASH算法(包括特殊HASH),通常使用彩虹表的方式來破解,彩虹表的原理是什麼呢?咱們先來了解下如何進行HASH碰撞。
單向HASH算法因爲不能進行解密運算,只能經過建表、查表的方式進行碰撞,即將經常使用的密碼及其對應的HASH值全計算出來並存儲,當獲取到HASH值是,直接查表獲取原始密碼,假設用MD5算法來保護6位數字密碼,能夠建以下表:
全表共100W條記錄,由於數據量不大,這種狀況建表、查表都很是容易。可是當密碼並非6位純數字密碼,而是數字、大小寫字母結合的10位密碼時,創建一個這樣的表須要(26+26+10)^ 10 ≈ 83億億(條記錄),存儲在硬盤上至少要佔用2000W TB的空間,這麼大的存儲空間,成本太大,幾乎不可行。
有什麼辦法能夠減小存儲空間?一種方法是「預計算哈希鏈」,「預計算哈希鏈」能夠大幅減小HASH表的存儲空間,但相應的增長了查表時的計算量,其原理大體以下:
建表過程:
先對原始數據「000000」進行一次HASH運算獲得「670B1E」,再對HASH值進行一次R運算,R是一個定製的算法能夠將HASH值映射到明文空間上(這裏咱們的明文空間是000000~999999),R運算後獲得「283651」,再對「283651」進行hash運算獲得「1A99CD」,而後在進行R運算獲得「819287」,如此重複屢次,獲得一條哈希鏈。而後再選用其它原始數據創建多條哈希鏈。最終僅將鏈頭和鏈尾保存下來,中間節點全都去掉。
查表過程:假設拿到了一條HASH值「670B1E」,首先進行一次R運算,獲得了「283651」,查詢全部鏈尾是否有命中,若是沒有,則再進行一次HASH、一次R,獲得了「819287」,再次全部鏈尾,能夠獲得看出已經命中。
這樣咱們就能夠基本確認「670B1E」對應的明文就在這條鏈上,而後咱們把這條鏈的生成過程進行從新計算,計算過程當中能夠發現「000000」的HASH值就是「670B1E」,這樣就完成了整個查表過程。這種表就是「預計算哈希鏈」。這種方式存在一個問題,多條鏈之間可能存在大量的重複數據,以下圖所示:
爲了解決這個問題,咱們將R算法進行擴展,一條鏈上的屢次R運算採用不一樣的算法,以下圖:
一條鏈上的每一個R算法都不同,就像彩虹的每層顏色同樣,所以取名的爲彩虹表。
固然彩虹表除了能夠用戶破解HASH算法外,理論上還能夠用於破解對稱加密算法,好比DES算法,因爲DES算法密鑰比較短,創建彩虹表破解是徹底可行的;但對於AES算法,因爲密鑰比較長,建表幾乎不可行(須要耗時N億年)。
3、小結
採用PBKDF二、bcrypt、scrypt等算法能夠有效抵禦彩虹表攻擊,即便數據泄露,最關鍵的「用戶密碼」仍然能夠獲得有效的保護,黑客沒法大批量破解用戶密碼,從而切斷撞庫掃號的根源。固然,對於已經泄露的密碼,仍是須要用戶儘快修改密碼,不要再使用已泄露的密碼。
END
我是武哥,最後給你們 免費分享我寫的 10 萬字 Spring Boot 學習筆記(帶完整目錄)以及對應的源碼 。這是我以前在 CSDN 開的一門課,因此筆記很是詳細完整,我準備將資料分享出來給你們免費學習,相信你們看完必定會有所收穫( 下面有下載方式 )。
能夠看出,我當時備課很是詳細,目錄很是完整,讀者能夠手把手跟着筆記,結合源代碼來學習。如今免費分享出來,有須要的讀者能夠下載學習,就在我公衆號回覆:筆記,就行。
關注Java禿頭哥
回覆:筆記
點贊是最大的支持
本文分享自微信公衆號 - 武哥聊編程(eson_15)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。