安全漏洞比以往任何時候都更常見,而密碼往往是鏈條中最薄弱的環節。攻擊者經常使用暴力攻擊、字典攻擊等方法來破解密碼。因此,確保密碼安全儲存且不易外洩至關重要。
密碼安全性差可能導致資料外洩、身分盜竊和重大財務損失。以純文字形式儲存密碼、使用弱雜湊演算法或未實施適當的存取控制是一些可能導致災難性後果的常見錯誤。
雜湊是將密碼轉換為固定長度字串的過程,這幾乎不可能進行逆向工程。一個好的雜湊函數應該計算速度快、確定性、不可逆,並為不同的輸入產生唯一的輸出。
有幾種強大的技術可以保護資料庫中的使用者密碼。以下部分詳細介紹了這些技術,以及程式碼範例、演示和結果。
加鹽是在對密碼進行雜湊處理之前將隨機資料新增至密碼的過程。這種技術可以確保即使兩個用戶具有相同的密碼,他們的雜湊值也會不同,使攻擊者更難以利用預先計算的雜湊表(彩虹表)進行攻擊。
Java 中的加鹽和雜湊範例程式碼:
import java.security.SecureRandom; import java.security.MessageDigest; import java.util.Base64; public class PasswordSecurity { private static final String SALT_ALGORITHM = "SHA1PRNG"; private static final String HASH_ALGORITHM = "SHA-256"; public static String generateSalt() throws Exception { SecureRandom sr = SecureRandom.getInstance(SALT_ALGORITHM); byte[] salt = new byte[16]; sr.nextBytes(salt); return Base64.getEncoder().encodeToString(salt); } public static String hashPassword(String password, String salt) throws Exception { MessageDigest md = MessageDigest.getInstance(HASH_ALGORITHM); md.update(salt.getBytes()); byte[] hashedPassword = md.digest(password.getBytes()); return Base64.getEncoder().encodeToString(hashedPassword); } public static void main(String[] args) throws Exception { String salt = generateSalt(); String hashedPassword = hashPassword("mySecurePassword123", salt); System.out.println("Salt: " + salt); System.out.println("Hashed Password: " + hashedPassword); } }
輸出顯示了唯一的鹽和雜湊密碼,清楚地表明即使相同的密碼也會因為不同的鹽而具有不同的雜湊值。
bcrypt、scrypt 和 Argon2 等現代哈希演算法是專門為計算密集型而設計的,這使得它們能夠抵抗暴力攻擊。這些演算法使用密鑰拉伸等技術,並且可以進行調整以隨著時間的推移增加其複雜性。
在 Java 中使用 bcrypt 的範例程式碼:
import org.mindrot.jbcrypt.BCrypt; public class BCryptExample { public static String hashPassword(String plainPassword) { return BCrypt.hashpw(plainPassword, BCrypt.gensalt(12)); } public static boolean checkPassword(String plainPassword, String hashedPassword) { return BCrypt.checkpw(plainPassword, hashedPassword); } public static void main(String[] args) { String hashed = hashPassword("mySecurePassword123"); System.out.println("Hashed Password: " + hashed); boolean isMatch = checkPassword("mySecurePassword123", hashed); System.out.println("Password Match: " + isMatch); } }
顯示雜湊後的密碼,且密碼驗證成功,證明了bcrypt對密碼雜湊的安全性和有效性。
Pepper 涉及在散列之前向密碼添加一個秘密密鑰(稱為胡椒)。胡椒與散列密碼和鹽分開存儲,通常存儲在應用程式程式碼或環境變數中,增加了額外的安全層。
實施策略:
即使有強大的哈希和加鹽,暴力攻擊仍然是一個威脅。實施速率限制(例如,限制登入嘗試次數)和帳戶鎖定機制有助於減輕這些風險。
Java 中帳戶鎖定範例程式碼:
import java.security.SecureRandom; import java.security.MessageDigest; import java.util.Base64; public class PasswordSecurity { private static final String SALT_ALGORITHM = "SHA1PRNG"; private static final String HASH_ALGORITHM = "SHA-256"; public static String generateSalt() throws Exception { SecureRandom sr = SecureRandom.getInstance(SALT_ALGORITHM); byte[] salt = new byte[16]; sr.nextBytes(salt); return Base64.getEncoder().encodeToString(salt); } public static String hashPassword(String password, String salt) throws Exception { MessageDigest md = MessageDigest.getInstance(HASH_ALGORITHM); md.update(salt.getBytes()); byte[] hashedPassword = md.digest(password.getBytes()); return Base64.getEncoder().encodeToString(hashedPassword); } public static void main(String[] args) throws Exception { String salt = generateSalt(); String hashedPassword = hashPassword("mySecurePassword123", salt); System.out.println("Salt: " + salt); System.out.println("Hashed Password: " + hashedPassword); } }
為了確保強大的安全性,請遵循以下最佳實務:
使用強烈且獨特的鹽和胡椒
每個密碼輸入的鹽應該是唯一的,並使用安全隨機數產生器產生。 Pepper 應安全存儲,切勿硬編碼在原始碼中。
定期更新您的雜湊演算法
隨時了解哈希演算法的進步,並根據需要調整您的實施,以保持安全,抵禦新的攻擊媒介。
實作多重驗證 (MFA)
雖然強大的密碼安全性至關重要,但實施 MFA 透過要求使用者提供多種形式的驗證來增加額外的安全層。
保護資料庫中的使用者密碼並不是一項一刀切的任務;它需要技術和實踐的結合來確保強大的安全性。透過實施加鹽、使用自適應雜湊演算法、採用胡椒以及設定速率限制和帳戶鎖定機制,開發人員可以顯著增強儲存的使用者密碼的安全性。
想了解更多或有疑問嗎?歡迎在下面評論!
閱讀更多文章:資料庫中的安全使用者密碼
以上是資料庫中的安全用戶密碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!