在信息安全的諸多領(lǐng)域之中,密碼的安全存儲(chǔ)無疑已然成為最為核心的問題之一。隨著攻擊技術(shù)的不斷演進(jìn),傳統(tǒng)的密碼存儲(chǔ)方法已無法抵御現(xiàn)代復(fù)雜的威脅。更為安全、健壯的密碼存儲(chǔ)機(jī)制也成為當(dāng)代信息安全從業(yè)者的關(guān)注點(diǎn)。本篇文章將引入并介紹密碼存儲(chǔ)中的基石,關(guān)于密碼哈希、鹽加密(Salting)、密鑰派生函數(shù)(KDF)的原理及其應(yīng)用,揭示密碼存儲(chǔ)中的常見誤區(qū),并分享一系列安全實(shí)踐。
一、為什么不能使用明文存儲(chǔ)密碼
直接將密碼以明文存儲(chǔ)在數(shù)據(jù)庫中無異于為攻擊者打開了方便之門。一旦數(shù)據(jù)庫遭遇泄露,攻擊者將輕而易舉地獲得所有用戶的明文密碼。更嚴(yán)重的是,這些密碼可能被用于其他攻擊場(chǎng)景,尤其是“憑證填充攻擊”(Credential Stuffing)。此類攻擊是指攻擊者利用已知的用戶名和密碼組合嘗試登錄其他系統(tǒng),時(shí)至今日,許多用戶仍在多個(gè)系統(tǒng)中重復(fù)使用同一個(gè)密碼。得益于此,這類攻擊在實(shí)際中往往具有極高的成功率。憑證填充攻擊還可能導(dǎo)致極為嚴(yán)重的后果,從電子郵件賬戶的入侵到銀行賬戶的盜竊,還有可能進(jìn)一步引發(fā)連鎖效應(yīng)。
因此,明文存儲(chǔ)密碼在現(xiàn)代信息安全領(lǐng)域是絕對(duì)不可取的。信息安全從業(yè)者必須采用適當(dāng)?shù)墓;蚣用芗夹g(shù)講原始密碼進(jìn)行處理后再存儲(chǔ)至數(shù)據(jù)庫中,即便攻擊者獲取了數(shù)據(jù)庫中的數(shù)據(jù),也無法輕易還原出用戶的密碼。
二、哈希與加密的區(qū)別:為什么密碼存儲(chǔ)需要哈希?
在密碼存儲(chǔ)的討論中,我們首先需要明確哈希與加密的本質(zhì)區(qū)別。
加密與哈希
加密是一個(gè)可逆的過程,通過特定的算法將明文轉(zhuǎn)換為密文,并且在擁有正確密鑰的前提下,密文可以被還原為明文。加密算法在數(shù)據(jù)傳輸和敏感數(shù)據(jù)保護(hù)中發(fā)揮著不可替代的作用。但與一般的認(rèn)知可能恰恰相反,加密技術(shù)并不適合用于密碼存儲(chǔ)。原因在于,一旦存儲(chǔ)密文的密鑰遭到泄露,攻擊者便可以通過解密操作直接恢復(fù)用戶密碼。鑒于此,加密在密碼存儲(chǔ)領(lǐng)域的應(yīng)用相對(duì)有限。
哈希則是不可逆的。這意味著一旦數(shù)據(jù)經(jīng)過哈希處理,理論上無法通過哈希值逆推出原始數(shù)據(jù)。哈希算法通過固定的規(guī)則對(duì)輸入進(jìn)行處理,并輸出一個(gè)固定長(zhǎng)度的哈希值。同樣的輸入必然會(huì)生成相同的輸出,這使得哈希算法在驗(yàn)證數(shù)據(jù)一致性方面具有獨(dú)特的優(yōu)勢(shì)。對(duì)于密碼存儲(chǔ)來說,哈希算法的不可逆性使得攻擊者即便獲取了哈希值,他們也無法輕易還原出原始密碼。
并非所有哈希算法的設(shè)計(jì)初衷并都用于安全保護(hù)。實(shí)際上大部分的哈希算法設(shè)計(jì)初衷都用于數(shù)據(jù)完整性校驗(yàn)。因此,在密碼存儲(chǔ)中,我們應(yīng)優(yōu)先選擇那些針對(duì)密碼存儲(chǔ)需求特別優(yōu)化的哈希函數(shù),如密碼哈希函數(shù)和密鑰派生函數(shù)。
哈希算法的選擇
常見的哈希算法包括 MD5、SHA1、SHA2、SHA3等。然而,MD5和 SHA1已被證明具有較弱的抗碰撞性,因此不再被推薦用于密碼存儲(chǔ)。當(dāng)前,推薦使用更為安全的算法,例如 SHA256或更高級(jí)的專為密碼存儲(chǔ)設(shè)計(jì)的 KDF算法(如 bcrypt、Argon2等)。
常見的哈希算法包括 MD5、SHA1、SHA256等。隨著密碼學(xué)領(lǐng)域的發(fā)展,MD5和 SHA1的抗碰撞性已被證明不足以抵御現(xiàn)代攻擊,尤其是針對(duì)彩虹表(Rainbow table)攻擊和碰撞攻擊,這部分內(nèi)容我們將在稍后講到。因此,這些算法已不再被推薦用于密碼存儲(chǔ)。
目前,安全專家建議使用更為安全的哈希算法,SHA256或 SHA3都是比較好的選擇。在密碼存儲(chǔ)場(chǎng)景中,使用專門設(shè)計(jì)的密碼哈希函數(shù)則更為合適。例如,bcrypt、Argon2和PBKDF2都是目前被廣泛使用的密碼哈希函數(shù)。其不僅能夠提供比通用哈希函數(shù)更強(qiáng)的安全性,還具備可調(diào)的計(jì)算復(fù)雜度,能夠有效抵御暴力破解攻擊和硬件加速攻擊(包括 GPU、ASIC攻擊等)。
三、加鹽(Salt):防御彩虹表攻擊的必然選擇
盡管哈希算法具備不可逆性,但它們本質(zhì)上是確定性的:相同的輸入總會(huì)生成相同的哈希值。彩虹表是一種預(yù)計(jì)算的哈希值與對(duì)應(yīng)明文的查找表,攻擊者可以利用彩虹表等預(yù)計(jì)算攻擊手段,輕松破解常見的密碼。
為了解決這一問題,密碼存儲(chǔ)中普遍引入了“加鹽”技術(shù)。鹽(Salt)是一個(gè)隨機(jī)生成的值,它會(huì)在密碼進(jìn)行哈希處理之前與密碼組合。通過這種方式,即使兩個(gè)用戶使用了相同的密碼,由于使用了不同的鹽值,最終存儲(chǔ)在數(shù)據(jù)庫中的哈希值也將不同。這種策略有效抵御了彩虹表攻擊,攻擊者無法為每個(gè)可能的鹽值與密碼組合生成預(yù)計(jì)算的哈希表。
如何正確使用鹽值?
鹽值的使用雖然簡(jiǎn)單,但其安全性依賴于幾點(diǎn)重要原則:
唯一性:每個(gè)用戶的密碼哈希都應(yīng)使用不同的鹽值。這樣,即使兩個(gè)用戶選擇了相同的密碼,其對(duì)應(yīng)的哈希值也會(huì)不同。
足夠長(zhǎng)度:鹽值的長(zhǎng)度應(yīng)足夠長(zhǎng),通常建議至少為 16字節(jié)或更長(zhǎng),為鹽值提供隨機(jī)性和不可預(yù)測(cè)性。
安全生成:鹽值必須通過安全的隨機(jī)數(shù)生成器生成,避免使用偽隨機(jī)數(shù)生成器(PRNG),偽隨機(jī)數(shù)可能會(huì)導(dǎo)致鹽值的可預(yù)測(cè)性,進(jìn)而削弱安全性。
知其原理,而在我們實(shí)際的開發(fā)過程中,目前主流的編程語言與安全框架均已集成成熟的鹽值算法庫,按需調(diào)用即可。
四、密鑰派生函數(shù)(KDF):密碼存儲(chǔ)的堅(jiān)實(shí)防線
雖然加鹽哈希在抵御彩虹表攻擊上有顯著效果,但它并不能完全防止暴力破解等其他形式的攻擊。攻擊者可以通過持續(xù)嘗試可能的密碼組合,最終得出正確的密碼。因此,進(jìn)一步增強(qiáng)密碼存儲(chǔ)的安全性成為當(dāng)務(wù)之急,這就引入了密鑰派生函數(shù)(Key Derivation Function,KDF)。
什么是 KDF?
KDF是一種增強(qiáng)版的哈希函數(shù),其核心目的是通過增加計(jì)算成本來阻止攻擊者的暴力破解。與標(biāo)準(zhǔn)哈希函數(shù)相比,KDF的工作原理是通過反復(fù)多次迭代原始輸入(通常會(huì)包括密碼和鹽值),從而使得每次哈希計(jì)算都更加耗時(shí)和資源密集。通過這種方式,KDF有效地增加了密碼哈希計(jì)算的難度和時(shí)間,使得即便擁有強(qiáng)大計(jì)算能力的攻擊者也無法快速破解密碼。
常見的 KDF算法包括上述提及的bcrypt、PBKDF2和Argon2。這類算法就是專門設(shè)計(jì)用于提高密碼存儲(chǔ)的安全性,不僅增加了計(jì)算復(fù)雜度,還可以通過調(diào)整參數(shù)來平衡安全性與性能之間的關(guān)系。
Argon2的優(yōu)勢(shì)
Argon2值得獨(dú)自拿來說一下。作為近年來最為推薦的 KDF算法之一,Argon2在 2015年密碼學(xué)競(jìng)賽中獲得了最高獎(jiǎng)項(xiàng)。Argon2被設(shè)計(jì)為可以抵抗現(xiàn)代硬件加速的暴力破解攻擊,特別是在 GPU、FPGA和 ASIC等硬件上,其通過增加內(nèi)存消耗使得這些攻擊的實(shí)施變得更加困難。
Argon2有三個(gè)版本:Argon2d側(cè)重于抗 GPU并行攻擊,Argon2i側(cè)重于抗時(shí)間側(cè)信道攻擊,而Argon2id則結(jié)合了兩者的優(yōu)點(diǎn),通常被認(rèn)為是密碼存儲(chǔ)的最佳選擇。通過合理調(diào)整 Argon2的內(nèi)存和計(jì)算參數(shù),可以根據(jù)實(shí)際需求實(shí)現(xiàn)較好的安全性與性能平衡,在對(duì)抗現(xiàn)代攻擊手段方面表現(xiàn)尤為出色。
五、彩虹表攻擊
彩虹表攻擊是一種通過查找預(yù)計(jì)算哈希值來破解密碼的技術(shù)。攻擊者會(huì)生成一個(gè)包含大量常見密碼及其哈希值的查找表,隨后將這些哈希值與數(shù)據(jù)庫中的密碼哈希進(jìn)行匹配,從而快速找出對(duì)應(yīng)的明文密碼。該攻擊方法特別適用于使用弱密碼且未進(jìn)行加鹽處理的系統(tǒng)。
相對(duì)地,彩虹表的有效性極大地依賴于預(yù)計(jì)算的范圍和密碼的復(fù)雜性。通過引入“加鹽(Salt)”技術(shù),每個(gè)密碼在哈希處理前加入一個(gè)獨(dú)特的隨機(jī)鹽值,這意味著即便兩個(gè)用戶使用相同的密碼,最終生成的哈希值也會(huì)完全不同。由于鹽值的隨機(jī)性,攻擊者很難為每種鹽值與密碼組合生成彩虹表,從而有效地抵御此類攻擊。
六、MD5和 SHA1:為何不再安全?
曾幾何時(shí),MD5和SHA1是廣泛應(yīng)用于密碼存儲(chǔ)和數(shù)據(jù)完整性校驗(yàn)的常用算法。然而,隨著計(jì)算能力的提升和密碼學(xué)研究的深入,這兩種算法的弱點(diǎn)逐漸暴露,尤其是在抗碰撞性方面的不足,使得它們?cè)诋?dāng)今的安全場(chǎng)景中不再適用。
MD5:早在 2004年,研究人員就已發(fā)現(xiàn)了 MD5的嚴(yán)重碰撞漏洞。碰撞攻擊的出現(xiàn)使得攻擊者可以生成兩個(gè)不同的輸入,它們具有相同的哈希值,從而削弱了 MD5的安全性。
SHA1:2017年,Google公開了一種有效的碰撞攻擊方法,證明 SHA1的安全性已經(jīng)不再足夠強(qiáng)大。由于碰撞攻擊的成本顯著降低,SHA1逐漸退出了密碼存儲(chǔ)和數(shù)據(jù)完整性驗(yàn)證的主流應(yīng)用。
目前,在密碼存儲(chǔ)和數(shù)據(jù)完整性驗(yàn)證中,建議使用更為安全的哈希算法,如SHA256和SHA3,它們?cè)诳古鲎残院涂贡┝ζ平夥矫嫣峁┝烁鼜?qiáng)的保障。此外,上文中提到的 KDF也不失為一種較好的選擇。
七、密碼存儲(chǔ)的最佳實(shí)踐
為了確保密碼存儲(chǔ)的安全性,安全行業(yè)有著以下公開的最佳實(shí)踐,這些實(shí)踐已經(jīng)得到廣泛采用,并應(yīng)用于各類安全敏感的系統(tǒng)中:
永遠(yuǎn)不要以明文形式存儲(chǔ)密碼。這是密碼存儲(chǔ)中的基本原則,一旦數(shù)據(jù)庫泄漏,將給系統(tǒng)中的用戶信息帶來災(zāi)難性后果。
使用強(qiáng)哈希算法或 KDF。推薦使用如Argon2、bcrypt或PBKDF2這樣的專用密碼哈希函數(shù),以提高暴力破解的難度。
為每個(gè)密碼使用唯一的鹽值。即使多個(gè)用戶使用相同的密碼,生成的哈希值也是唯一的,防止彩虹表攻擊。
避免使用已被證明不安全的算法。如 MD5和SHA1等算法已不再適用于密碼存儲(chǔ),應(yīng)選擇更為安全的替代方案。
定期審查和更新密碼存儲(chǔ)策略。密碼存儲(chǔ)的安全性并非一勞永逸,隨著攻擊技術(shù)的進(jìn)步,持續(xù)跟蹤密碼學(xué)領(lǐng)域的最新發(fā)展,并對(duì)系統(tǒng)進(jìn)行相應(yīng)的調(diào)整,才是確保安全的長(zhǎng)久之策。
結(jié)語
密碼存儲(chǔ)的安全性直接關(guān)系到整個(gè)系統(tǒng)的安全。隨著現(xiàn)代攻擊手段的不斷升級(jí),采用合理的加鹽哈希技術(shù)、密鑰派生函數(shù),并定期更新安全策略,才能有效降低數(shù)據(jù)泄露的風(fēng)險(xiǎn),保障用戶的隱私與安全。在這個(gè)動(dòng)態(tài)變化的領(lǐng)域中,持續(xù)的學(xué)習(xí)與實(shí)踐是每一個(gè)安全從業(yè)者的必修課。
了解網(wǎng)絡(luò)安全更多信息,歡迎前往【艾體寶】官方網(wǎng)站
審核編輯 黃宇
-
存儲(chǔ)
+關(guān)注
關(guān)注
13文章
4338瀏覽量
85997 -
算法
+關(guān)注
關(guān)注
23文章
4624瀏覽量
93111 -
數(shù)據(jù)庫
+關(guān)注
關(guān)注
7文章
3839瀏覽量
64544
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論