0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

艾體寶洞察 一文讀懂最新密碼存儲(chǔ)方法,揭秘密碼存儲(chǔ)常見誤區(qū)!

laraxu ? 來源:laraxu ? 作者:laraxu ? 2024-09-14 17:37 ? 次閱讀

信息安全的諸多領(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ù)庫(kù)中無異于為攻擊者打開了方便之門。一旦數(shù)據(jù)庫(kù)遭遇泄露,攻擊者將輕而易舉地獲得所有用戶的明文密碼。更嚴(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ù)庫(kù)中,即便攻擊者獲取了數(shù)據(jù)庫(kù)中的數(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ǔ)來說,哈希算法的不可逆性使得攻擊者即便獲取了哈希值,他們也無法輕易還原出原始密碼。

wKgaomblWNSAa15BAALBBqF08Ic970.png

并非所有哈希算法的設(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、Argon2PBKDF2都是目前被廣泛使用的密碼哈希函數(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ù)庫(kù)中的哈希值也將不同。這種策略有效抵御了彩虹表攻擊,攻擊者無法為每個(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ā)過程中,目前主流的編程語(yǔ)言與安全框架均已集成成熟的鹽值算法庫(kù),按需調(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ì)算能力的攻擊者也無法快速破解密碼。

wKgZomblWO2ATPllAAEy07s_Vu4768.png

常見的 KDF算法包括上述提及的bcryptPBKDF2Argon2。這類算法就是專門設(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ù)庫(kù)中的密碼哈希進(jìn)行匹配,從而快速找出對(duì)應(yīng)的明文密碼。該攻擊方法特別適用于使用弱密碼且未進(jìn)行加鹽處理的系統(tǒng)。

wKgaomblWPmAevCTAAFTY9Zep14295.png

相對(duì)地,彩虹表的有效性極大地依賴于預(yù)計(jì)算的范圍和密碼的復(fù)雜性。通過引入“加鹽(Salt)”技術(shù),每個(gè)密碼在哈希處理前加入一個(gè)獨(dú)特的隨機(jī)鹽值,這意味著即便兩個(gè)用戶使用相同的密碼,最終生成的哈希值也會(huì)完全不同。由于鹽值的隨機(jī)性,攻擊者很難為每種鹽值與密碼組合生成彩虹表,從而有效地抵御此類攻擊。

六、MD5和 SHA1:為何不再安全?

曾幾何時(shí),MD5SHA1是廣泛應(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)證中,建議使用更為安全的哈希算法,如SHA256SHA3,它們?cè)诳古鲎残院涂贡┝ζ平夥矫嫣峁┝烁鼜?qiáng)的保障。此外,上文中提到的 KDF也不失為一種較好的選擇。

七、密碼存儲(chǔ)的最佳實(shí)踐

為了確保密碼存儲(chǔ)的安全性,安全行業(yè)有著以下公開的最佳實(shí)踐,這些實(shí)踐已經(jīng)得到廣泛采用,并應(yīng)用于各類安全敏感的系統(tǒng)中:

永遠(yuǎn)不要以明文形式存儲(chǔ)密碼。這是密碼存儲(chǔ)中的基本原則,一旦數(shù)據(jù)庫(kù)泄漏,將給系統(tǒng)中的用戶信息帶來災(zāi)難性后果。

使用強(qiáng)哈希算法或 KDF。推薦使用如Argon2、bcryptPBKDF2這樣的專用密碼哈希函數(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é)語(yǔ)

密碼存儲(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)站

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)
    +關(guān)注

    關(guān)注

    13

    文章

    4122

    瀏覽量

    85270
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4551

    瀏覽量

    92012
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3710

    瀏覽量

    64021
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    電子密碼

    ,所有輸入清除。3、修改密碼:在開鎖狀態(tài)下,再)鍵,此時(shí)聽到兩聲提示,輸入新的六位密碼并按【D】(重設(shè))鍵,再重復(fù)輸入新密碼并按【D】,會(huì)聽到兩聲提示音,表示重設(shè)
    發(fā)表于 07-26 15:59

    求4*4數(shù)字密碼鎖的C程序

    要求初始密碼為六位,可以輸入和保存新密碼,最好是有圖和程序,新人剛接觸單片機(jī),找份參考
    發(fā)表于 12-24 20:07

    單片機(jī)密碼鎖設(shè)計(jì)資料

    即可開鎖,開鎖后,開鎖指示燈亮。修改密碼時(shí),首先按下“ # ”鍵,緊急著輸入正確的6位原始密碼后再次下“ # ”鍵,開鎖指示燈亮,之后接著輸入6位新密碼后,再按下“ # ”鍵,再次輸入新密碼
    發(fā)表于 04-01 15:22

    基于單片機(jī)的電子密碼

    初始密碼,然后按“確認(rèn)”鍵;②再按“設(shè)置”鍵,輸入新密碼,然后按“確認(rèn)”鍵;③再次輸入新密碼,然后按“確認(rèn)”鍵。這樣密碼設(shè)置就完成了。4、開鎖者只有輸入
    發(fā)表于 05-09 21:47

    基于單片機(jī)的電子密碼鎖設(shè)計(jì)

    初始密碼,然后按“確認(rèn)”鍵;②再按“設(shè)置”鍵,輸入新密碼,然后按“確認(rèn)”鍵;③再次輸入新密碼,然后按“確認(rèn)”鍵。這樣密碼設(shè)置就完成了。4、開鎖者只有輸入
    發(fā)表于 05-09 22:09

    數(shù)碼管電子密碼

    電子 密碼鎖,可設(shè)定新密碼。推薦課程:課程名稱:PCB電磁兼容設(shè)計(jì)案例分析與仿真解析課程鏈接:http://url.elecfans.com/u/05942d9ef
    發(fā)表于 10-24 10:27

    急急急?。。∏驝語(yǔ)言編寫的單片機(jī)電子密碼鎖程序

    則開鎖,表示不正確顯示密碼錯(cuò)誤重新輸入密碼,當(dāng)三次密碼錯(cuò)誤則發(fā)出報(bào)警;鎖用發(fā)光二極管表示,亮表示鎖開,當(dāng)用戶需要修改密碼時(shí),先按下鍵盤設(shè)置鍵后輸入原來的
    發(fā)表于 04-18 10:24

    超全面!破解window開機(jī)密碼方法!

    忘記開機(jī)密碼?、簡(jiǎn)單的方法:  開機(jī)啟動(dòng)windows,進(jìn)入歡迎界面后,會(huì)出現(xiàn)輸入用戶名密碼提示框,這時(shí)候,同時(shí)按住Ctrl+Alt+Delete,會(huì)跳出
    發(fā)表于 06-03 14:40

    基于51單片機(jī)的密碼

    并按下 # 鍵,此時(shí)聽到兩聲提示,輸入新的六位密碼并按 D 鍵,再重復(fù)輸入新密碼并按 D ,會(huì)聽到兩聲提示音,表示重設(shè)密碼成功,內(nèi)部保存新密碼
    發(fā)表于 10-18 22:57

    教你如何修改NAS網(wǎng)絡(luò)存儲(chǔ)中的用戶密碼

    點(diǎn)擊用戶設(shè)置; 3.輸入原密碼新密碼,點(diǎn)擊應(yīng)用; 4.應(yīng)用后進(jìn)入登錄界面,輸入新設(shè)置的密碼,即可登錄TOS系統(tǒng)。 第二種1.TOS桌面-控制面板-訪問權(quán)限-用戶; 2.選擇用戶,點(diǎn)擊編輯; 3.輸入
    發(fā)表于 02-01 17:44

    有沒有方法在不使用STM32H7的情況下更新下個(gè)電源周期可用的密碼運(yùn)行時(shí)間呢?

    環(huán)境進(jìn)行開發(fā)。目前使用Nucleo板。該應(yīng)用程序是個(gè)嵌入式 Web 服務(wù)器,而瀏覽器是用戶登錄設(shè)備以更改設(shè)置等的客戶端。我確實(shí)遇到過些文章,這些文章確實(shí)說可以更新存儲(chǔ)在 MCU 閃存上的
    發(fā)表于 12-22 06:34

    i.MX6ULL ---- ElfBoard 的ELF1 板卡重新燒寫完成后帶默認(rèn)密碼方法

    New password: //在此處輸入要更換的新密碼,密碼不顯示,直接輸入即可 Bad password: too short. Warning: weak password (enter
    發(fā)表于 10-20 09:46

    基于明文長(zhǎng)度的構(gòu)建橢圓曲線密碼方法

    針對(duì)存儲(chǔ)橢圓曲線密碼加密生成的密與明文相比需要的存儲(chǔ)空間較多的問題,提出了種基于明文長(zhǎng)度的構(gòu)建橢圓曲線
    發(fā)表于 01-02 17:19 ?0次下載
    基于明文長(zhǎng)度的構(gòu)建橢圓曲線<b class='flag-5'>密碼</b>密<b class='flag-5'>文</b>的<b class='flag-5'>方法</b>

    不知道嵌入式Linux系統(tǒng)下的root密碼,修改新密碼并進(jìn)入系統(tǒng)

    今天朋友問不知道root 密碼怎么修改。他這個(gè)系統(tǒng)是海思平臺(tái)的嵌入式Linux系統(tǒng)。然后嘗試了修改并進(jìn)入系統(tǒng)。嵌入式Linux中的root 密碼忘記了或者想破解別人系統(tǒng)的密碼登陸進(jìn)去
    發(fā)表于 11-01 17:59 ?14次下載
    不知道嵌入式Linux系統(tǒng)下的root<b class='flag-5'>密碼</b>,修改<b class='flag-5'>新密碼</b>并進(jìn)入系統(tǒng)

    賬號(hào)密碼存儲(chǔ)生成

    賬號(hào)密碼存儲(chǔ)生成資料分享
    發(fā)表于 11-23 15:17 ?2次下載