作為互聯(lián)網(wǎng)公司的信息安全從業(yè)人員經(jīng)常要處理撞庫(kù)掃號(hào)事件,產(chǎn)生撞庫(kù)掃號(hào)的根本原因是一些企業(yè)發(fā)生了信息泄露事件,且這些泄露數(shù)據(jù)未加密或者加密方式比較弱,導(dǎo)致黑客可以還原出原始的用戶密碼。目前已經(jīng)曝光的信息泄露事件至少上百起,其中包括多家一線互聯(lián)網(wǎng)公司,泄露總數(shù)據(jù)超過10億條。本文作者就職于攜程技術(shù)中心信息安全部,文中他將分享用戶密碼的加密方式以及主要的破解方法。
要完全防止信息泄露是非常困難的事情,除了防止黑客外,還要防止內(nèi)部人員泄密。但 如果采用合適的算法去加密用戶密碼,即使信息泄露出去,黑客也無(wú)法還原出原始的密碼 (或者還原的代價(jià)非常大)。也就是說(shuō)我們可以將工作重點(diǎn)從防止泄露轉(zhuǎn)換到防止黑客還原出數(shù)據(jù)。下面我們將分別介紹用戶密碼的加密方式以及主要的破解方法。
用戶密碼加密
用戶密碼保存到數(shù)據(jù)庫(kù)時(shí),常見的加密方式有哪些,我們?cè)摬捎檬裁捶绞絹?lái)保護(hù)用戶的密碼呢?以下幾種方式是常見的密碼保存方式:
-
直接明文保存,比如用戶設(shè)置的密碼是“123456”,直接將“123456”保存在數(shù)據(jù)庫(kù)中,這種是最簡(jiǎn)單的保存方式,也是最不安全的方式。但實(shí)際上不少互聯(lián)網(wǎng)公司,都可能采取的是這種方式。
-
使用對(duì)稱加密算法來(lái)保存,比如3DES、AES等算法,使用這種方式加密是可以通過解密來(lái)還原出原始密碼的,當(dāng)然前提條件是需要獲取到密鑰。不過既然大量的用戶信息已經(jīng)泄露了,密鑰很可能也會(huì)泄露,當(dāng)然可以將一般數(shù)據(jù)和密鑰分開存儲(chǔ)、分開管理,但要完全保護(hù)好密鑰也是一件非常復(fù)雜的事情,所以這種方式并不是很好的方式。
-
使用MD5、SHA1等單向HASH算法保護(hù)密碼,使用這些算法后,無(wú)法通過計(jì)算還原出原始密碼,而且實(shí)現(xiàn)比較簡(jiǎn)單,因此很多互聯(lián)網(wǎng)公司都采用這種方式保存用戶密碼,曾經(jīng)這種方式也是比較安全的方式,但隨著彩虹表技術(shù)的興起,可以建立彩虹表進(jìn)行查表破解,目前這種方式已經(jīng)很不安全了。
-
特殊的單向HASH算法,由于單向HASH算法在保護(hù)密碼方面不再安全,于是有些公司在單向HASH算法基礎(chǔ)上進(jìn)行了加鹽、多次HASH等擴(kuò)展,這些方式可以在一定程度上增加破解難度,對(duì)于加了“固定鹽”的HASH算法,需要保護(hù)“鹽”不能泄露,這就會(huì)遇到“保護(hù)對(duì)稱密鑰”一樣的問題,一旦“鹽”泄露,根據(jù)“鹽”重新建立彩虹表可以進(jìn)行破解,對(duì)于多次HASH,也只是增加了破解的時(shí)間,并沒有本質(zhì)上的提升。
-
PBKDF2算法,該算法原理大致相當(dāng)于在HASH算法基礎(chǔ)上增加隨機(jī)鹽,并進(jìn)行多次HASH運(yùn)算,隨機(jī)鹽使得彩虹表的建表難度大幅增加,而多次HASH也使得建表和破解的難度都大幅增加。使用PBKDF2算法時(shí),HASH算法一般選用sha1或者sha256,隨機(jī)鹽的長(zhǎng)度一般不能少于8字節(jié),HASH次數(shù)至少也要1000次,這樣安全性才足夠高。一次密碼驗(yàn)證過程進(jìn)行1000次HASH運(yùn)算,對(duì)服務(wù)器來(lái)說(shuō)可能只需要1ms,但對(duì)于破解者來(lái)說(shuō)計(jì)算成本增加了1000倍,而至少8字節(jié)隨機(jī)鹽,更是把建表難度提升了N個(gè)數(shù)量級(jí),使得大批量的破解密碼幾乎不可行,該算法也是美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究院推薦使用的算法。
-
bcrypt、scrypt等算法,這兩種算法也可以有效抵御彩虹表,使用這兩種算法時(shí)也需要指定相應(yīng)的參數(shù),使破解難度增加。
下表對(duì)比了各個(gè)算法的特性:
算法 | 特點(diǎn) | 有效破解方式 | 破解難度 | 其它 |
明文保存 | 實(shí)現(xiàn)簡(jiǎn)單 | 無(wú)需破解 | 簡(jiǎn)單 | |
對(duì)稱加密 | 可以解密出明文 | 獲取密鑰 | 中 | 需要確保密鑰不泄露 |
單向HASH | 不可解密 | 碰撞、彩虹表 | 中 | |
特殊HASH | 不可解密 | 碰撞、彩虹表 | 中 | 需要確保“鹽”不泄露 |
Pbkdf2 | 不可解密 | 無(wú) | 難 | 需要設(shè)定合理的參數(shù) |
用戶密碼破解
用戶密碼破解需要針對(duì)具體的加密方式來(lái)實(shí)施,如果使用對(duì)稱加密,并且算法足夠安全(比如AES),必須獲取到密鑰才能解密,沒有其它可行的破解方式。
如果采用HASH算法(包括特殊HASH),一般使用彩虹表的方式來(lái)破解,彩虹表的原理是什么呢?我們先來(lái)了解下如何進(jìn)行HASH碰撞。單向HASH算法由于不能進(jìn)行解密運(yùn)算,只能通過建表、查表的方式進(jìn)行碰撞,即將常用的密碼及其對(duì)應(yīng)的HASH值全計(jì)算出來(lái)并存儲(chǔ),當(dāng)獲取到HASH值是,直接查表獲取原始密碼,假設(shè)用MD5算法來(lái)保護(hù)6位數(shù)字密碼,可以建如下表:
原始密碼 | MD5值 |
0 | 670B14728AD9902AECBA32E22FA4F6BD |
1 | 04FC711301F3C784D66955D98D399AFB |
… | … |
999999 | 52C69E3A57331081823331C4E69D3F2E |
全表共100W條記錄,因?yàn)閿?shù)據(jù)量不大,這種情況建表、查表都非常容易。但是當(dāng)密碼并不是6位純數(shù)字密碼,而是數(shù)字、大小寫字母結(jié)合的10位密碼時(shí),建立一個(gè)這樣的表需要(26+26+10)^ 10 ≈ 83億億(條記錄),存儲(chǔ)在硬盤上至少要占用2000W TB的空間,這么大的存儲(chǔ)空間,成本太大,幾乎不可行。有什么辦法可以減少存儲(chǔ)空間?一種方法是“預(yù)計(jì)算哈希鏈”,“預(yù)計(jì)算哈希鏈”可以大幅減少HASH表的存儲(chǔ)空間,但相應(yīng)的增加了查表時(shí)的計(jì)算量,其原理大致如下:
建表過程:
先對(duì)原始數(shù)據(jù)“000000”進(jìn)行一次HASH運(yùn)算得到“670B1E”,再對(duì)HASH值進(jìn)行一次R運(yùn)算,R是一個(gè)定制的算法可以將HASH值映射到明文空間上(這里我們的明文空間是000000~999999),R運(yùn)算后得到“283651”,再對(duì)“283651”進(jìn)行hash運(yùn)算得到“1A99CD”,然后在進(jìn)行R運(yùn)算得到“819287”,如此重復(fù)多次,得到一條哈希鏈。然后再選用其它原始數(shù)據(jù)建立多條哈希鏈。最終僅將鏈頭和鏈尾保存下來(lái),中間節(jié)點(diǎn)全都去掉。
查表過程:假設(shè)拿到了一條HASH值“670B1E”,首先進(jìn)行一次R運(yùn)算,得到了“283651”,查詢所有鏈尾是否有命中,如果沒有,則再進(jìn)行一次HASH、一次R,得到了“819287”,再次所有鏈尾,可以得到看出已經(jīng)命中。這樣我們就可以基本確認(rèn)“670B1E”對(duì)應(yīng)的明文就在這條鏈上,然后我們把這條鏈的生成過程進(jìn)行重新計(jì)算,計(jì)算過程中可以發(fā)現(xiàn)“000000”的HASH值就是“670B1E”,這樣就完成了整個(gè)查表過程。這種表就是“預(yù)計(jì)算哈希鏈”。這種方式存在一個(gè)問題,多條鏈之間可能存在大量的重復(fù)數(shù)據(jù),如下圖所示:
為了解決這個(gè)問題,我們將R算法進(jìn)行擴(kuò)展,一條鏈上的多次R運(yùn)算采用不同的算法,如下圖:
一條鏈上的每個(gè)R算法都不一樣,就像彩虹的每層顏色一樣,因此取名的為彩虹表。
當(dāng)然彩虹表除了可以用戶破解HASH算法外,理論上還可以用于破解對(duì)稱加密算法,比如DES算法,由于DES算法密鑰比較短,建立彩虹表破解是完全可行的;但對(duì)于AES算法,由于密鑰比較長(zhǎng),建表幾乎不可行(需要耗時(shí)N億年)。
小結(jié)
采用PBKDF2、bcrypt、scrypt等算法可以有效抵御彩虹表攻擊,即使數(shù)據(jù)泄露,最關(guān)鍵的“用戶密碼”仍然可以得到有效的保護(hù),黑客無(wú)法大批量破解用戶密碼,從而切斷撞庫(kù)掃號(hào)的根源。當(dāng)然,對(duì)于已經(jīng)泄露的密碼,還是需要用戶盡快修改密碼,不要再使用已泄露的密碼。
微服務(wù)系列課程推薦
StuQ 特別邀請(qǐng)前 ThoughtWorks 首席咨詢師,國(guó)內(nèi)首本微服務(wù)中文書籍《微服務(wù)架構(gòu)與實(shí)踐》的作者王磊,共同推出《微服務(wù)架構(gòu)與實(shí)踐》精品小班教學(xué),通過專門設(shè)計(jì)的練習(xí)與案例,快速掌握微服務(wù)相關(guān)的技能。
本課程分為基礎(chǔ)篇和高級(jí)篇兩部分,旨在通過完整的案例,呈現(xiàn)微服務(wù)的開發(fā)、測(cè)試、構(gòu)建、部署、運(yùn)維等實(shí)踐,幫助學(xué)員了解微服務(wù)的核心、以及實(shí)施過程中的挑戰(zhàn)與應(yīng)對(duì)方案。
基礎(chǔ)篇將使用Spring Boot、Spring Cloud以及Docker,構(gòu)建基于微服務(wù)架構(gòu)的活動(dòng)報(bào)名系統(tǒng)。同時(shí),使用Netflix OSS構(gòu)建服務(wù)的支持組件,包括集中化配置中心、服務(wù)注冊(cè)與發(fā)現(xiàn)、API網(wǎng)關(guān)、容錯(cuò)處理等支撐性服務(wù)組件。
高級(jí)篇將關(guān)注微服務(wù)的測(cè)試,服務(wù)安全、異步任務(wù)系統(tǒng)、日志聚合、監(jiān)控告警以及持續(xù)交付流水線等高級(jí)話題,為微服務(wù)規(guī)模化實(shí)施提供指導(dǎo)意見。
來(lái)自:http://mp.weixin.qq.com/s?__biz=MzA5Nzc4OTA1Mw==&mid=2659598304&idx=1&sn=0d8c1784267ca309ae740eea1aa572c6&c
掃碼二維碼 獲取免費(fèi)視頻學(xué)習(xí)資料
- 本文固定鏈接: http://www.wangchenghua.com/post/5409/
- 轉(zhuǎn)載請(qǐng)注明:轉(zhuǎn)載必須在正文中標(biāo)注并保留原文鏈接
- 掃碼: 掃上方二維碼獲取免費(fèi)視頻資料