為什么要給密碼加鹽?
使用“鹽”來增強(qiáng)哈希是密碼存儲(chǔ)中的重要安全措施,能夠防止彩虹表攻擊,并使暴力破解更加困難。
什么是“鹽”?
鹽(Salt) 是一段隨機(jī)生成的數(shù)據(jù),用于與密碼一起進(jìn)行哈希計(jì)算,以確保即使用戶的密碼相同,存儲(chǔ)在數(shù)據(jù)庫(kù)中的哈希值也不同。
通過為每個(gè)用戶生成唯一的鹽,可以有效防止攻擊者使用預(yù)計(jì)算的彩虹表(即一張已經(jīng)計(jì)算好常用密碼和對(duì)應(yīng)哈希值的表)來破解密碼。
為什么需要“鹽”?
如果不使用鹽,多個(gè)用戶的相同密碼會(huì)生成相同的哈希值。這樣,一旦攻擊者拿到數(shù)據(jù)庫(kù),他可以輕松找到哪些用戶的密碼相同,甚至使用預(yù)先計(jì)算的哈希值表來快速破解常見的密碼。
例如,假設(shè)兩個(gè)用戶都使用了簡(jiǎn)單的密碼“password123”。沒有鹽的情況下,它們的哈希值是相同的。攻擊者可以通過查找這個(gè)哈希值來立即破解密碼。加入鹽之后,即使密碼相同,生成的哈希值也會(huì)不同,從而提高安全性。
如何生成和使用“鹽”?
以下是使用“鹽”進(jìn)行哈希計(jì)算的完整流程:
步驟1:生成隨機(jī)鹽
鹽必須是隨機(jī)生成的,且應(yīng)該使用加密安全的偽隨機(jī)數(shù)生成器(如 SecureRandom)來確保其難以預(yù)測(cè)。
鹽值的長(zhǎng)度應(yīng)至少為 16 字節(jié),以確保足夠的隨機(jī)性和安全性。
步驟2:將鹽與密碼結(jié)合
將生成的鹽值與用戶輸入的密碼進(jìn)行拼接(一般是將鹽值加在密碼的前面或后面)。
步驟3:對(duì)鹽化后的密碼進(jìn)行哈希處理
使用合適的哈希算法(如 bcrypt、Argon2、scrypt)對(duì)“鹽化”后的密碼進(jìn)行哈希處理。
步驟4:將鹽與哈希值一起存儲(chǔ)
將生成的鹽值與哈希值一起存儲(chǔ)在數(shù)據(jù)庫(kù)中。通常鹽值可以公開存儲(chǔ),因?yàn)樗⒉恍枰用堋?/p>
如何驗(yàn)證密碼?
驗(yàn)證用戶登錄時(shí),過程如下:
- 提取存儲(chǔ)的鹽值 和哈希值。
- 使用同樣的鹽值與用戶輸入的密碼進(jìn)行拼接。
- 重新哈希組合后的密碼,并與存儲(chǔ)的哈希值進(jìn)行比對(duì)。
其他保證密碼安全的措施
除了給密碼加鹽外,以下列出一些常用的保證密碼安全的方案:
- 定期更新密碼存儲(chǔ)方案 密碼哈希算法的強(qiáng)度可能隨時(shí)間推移而變?nèi)酢.?dāng)算法或參數(shù)需要更新時(shí),逐步遷移用戶的哈希密碼。例如,在用戶下次登錄時(shí)用新的算法重新哈希密碼。
- 保護(hù)數(shù)據(jù)庫(kù)和系統(tǒng)本身 嚴(yán)格控制對(duì)數(shù)據(jù)庫(kù)的訪問權(quán)限,確保只有經(jīng)過授權(quán)的人員或系統(tǒng)能夠訪問。定期檢查和修復(fù)系統(tǒng)漏洞,保證系統(tǒng)環(huán)境的安全性。
- 啟用雙因素認(rèn)證(2FA) 即使密碼被泄露,啟用雙因素認(rèn)證也能大幅提高安全性。攻擊者需要額外的信息(如短信驗(yàn)證碼或硬件令牌)才能訪問賬戶。