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