目錄
引言
明文存儲
基本哈希存儲
加鹽哈希存儲
適應性哈希算法
密碼加密存儲
小結
引言
密碼是最常用的身份驗證手段,既簡單又高效。密碼安全是網絡安全的基石,對保護個人和組織信息的安全具有根本性的作用。然而有關密碼泄漏的安全問題一再發生,大部分都是因為密碼的存儲不安全導致的,那么該如何安全地存儲密碼呢?接下來就詳細講解一下各種密碼存儲方案以及對應的優缺點,通過各種方案的對比來選擇出最佳的方案。
明文存儲
明文存儲密碼是指在數據庫或其他存儲系統中直接存儲用戶密碼的原始形式,沒有進行任何加密或散列處理。這種方式意味著密碼以可讀形式保存,任何可以訪問存儲系統的人都能直接看到明文密碼。
這種方式在早期的 Web 應用里面非常常見,一來是為了實現簡單,二來是那個時候安全問題不是特別突出,開發人員沒有對應的安全意識。隨著安全問題日益增多,開發人員安全意識也日益提高,當下這種方式已經很少見了,但是依然有很多缺乏安全意識的同學還這么干。這種方式的缺點就是極其不安全,主要是以下幾個方面:
- 安全性極低:如果數據庫遭到未授權訪問,攻擊者可以立即獲取所有用戶的密碼。不僅危害用戶在當前系統中的安全,還威脅用戶在其他系統中賬戶的安全(因為許多用戶會在不同的系統中使用同樣的密碼)。
- 違反合規性:多數現代的數據保護法規和標準,如歐盟的通用數據保護條例(GDPR)和支付卡行業數據安全標準(PCI DSS),都要求對敏感數據進行加密處理,明文存儲密碼已經違反了這些法規。
- 內部威脅:即使外部攻擊者無法訪問數據庫,公司內部的員工也可能無意或有意地泄露密碼,增加了內部安全問題發生的風險。
因為這些缺點,明文存儲密碼是絕對不能使用的方法。
基本哈希存儲
基本哈希存儲密碼是指使用哈希函數(如 MD5、SHA-1 或 SHA-256)將密碼轉換成固定長度的字符串存儲在數據庫或其他存儲系統中。哈希函數是單向函數,理論上不能從哈希值逆向推導出原始密碼。這種方式雖然比明文存儲安全性高一些,但仍然有一些明顯的缺點:
- 容易產生哈希碰撞:基本的哈希算法例如 MD5 和 SHA-1,已經被證明存在哈希碰撞的問題,即不同的輸入可能產生相同的輸出,降低了安全性。
- 易被破解:因為相同的密碼總是產生相同的哈希值,使得攻擊者可以使用彩虹表(預先計算的哈希值表)來反向查找密碼。另外由于基本哈希函數的計算速度很快,攻擊者可以在短時間內嘗試大量可能的密碼,使用暴力攻擊或字典攻擊方法來找到原始密碼。
這種方式最好不要使用。
加鹽哈希存儲
加鹽哈希存儲密碼是指在對密碼散列過程中加入一個額外的隨機值(稱為“鹽”),這個鹽是在用戶每次注冊或更改密碼時隨機生成的,與密碼一起被哈希處理。然后將鹽和哈希值一起存儲在數據庫中或其他存儲系統中。當用戶嘗試登錄時,取出這個鹽并與用戶輸入的密碼一起哈希,然后比較這個哈希值與存儲的哈希值是否匹配。加鹽哈希的目的是為了增加密碼存儲的復雜性和安全性,用于抵御彩虹表攻擊。因為即使兩個用戶使用相同的密碼,由于鹽的不同,對應的哈希值也會不同。這種方式雖然可以抵抗彩虹表攻擊,但如果使用的哈希函數計算速度很快(如 MD5、SHA-1),則依然容易被暴力破解。使用這種方式需要注意以下幾點:
- 鹽的管理:鹽必須獨特且隨機,同時需要安全地存儲。如果鹽的生成不夠隨機或者存儲不當,那么安全性就會大打折扣。
- 使用方式:對于每個用戶都要使用不同的鹽并且在服務器端進行哈希,如使用相同的鹽或者在客戶端進行哈希,安全性會大大降低。
- 使用強哈希函數:由于弱哈希函數例如 MD5、SHA-1 等已經被證明不夠安全,建議至少選擇使用 SHA256 算法。
這種方式目前被廣泛使用,但是還有更優的方式。
適應性哈希算法
適應性哈希算法是針對密碼存儲做了特別設計的算法,設計時考慮了計算時間,可以調整計算復雜度,以適應硬件性能的提升,使得即使在計算能力增強的情況下,破解密碼的難度也能保持在一個較高的水平。
這類算法比較有代表性的是 bcrypt、scrypt、Argon2 等,其中?bcrypt 是使用最廣泛的,關于 bcrypt 的詳解可以參考之前的文章 《安全高效又易用的密碼哈希神器-bcrypt 算法解析》。
使用適應性哈希算法存儲密碼是目前的最佳實踐,這些算法專門為密碼存儲而設計,提供了鹽值的自動管理和計算強度的調整能力,以此來抵御各種攻擊手段。唯一缺點可能就是兼容性問題了,在一些受限環境中,可能沒有對應的實現。使用這種方式時需要注意的一點是要適當配置好工作因子,不然仍然可能受到攻擊。
密碼加密存儲
密碼加密存儲是指使用加密算法(對稱算法或非對稱算法)對用戶密碼進行加密后存儲在數據庫中或其他存儲系統中。與哈希方式不同的是加密是一個可逆的過程,可以通過解密得到原始密碼。這通常涉及到一個密鑰,只有知道這個密鑰的人才能解密密碼。
使用對稱或非對稱加密算法對密碼進行加密,然后存儲加密后的值。缺陷主要是以下幾點:
- 密碼加密的安全性極大地依賴于密鑰的安全性。如果密鑰被泄露,所有的密碼都將以明文形式泄露。
- 存儲可逆形式的密碼可能會違反某些隱私和安全標準,如 GDPR 或 PCI DSS。
- 即使外部攻擊者無法訪問數據庫,公司內部的員工也可能無意中或有意地使用秘鑰解密密碼,進而泄露密碼,增加了內部安全問題發生的風險。
在現代的密碼存儲實踐中,是不推薦使用可逆的加密算法存儲的,所以這種方式不推薦使用。
小結
每種密碼存儲方法都有其優缺點,但最佳實踐是使用適應性哈希算法,適應性哈希算法專門為密碼存儲而設計,提供了鹽值的自動管理和計算強度的調整能力,以此來抵御各種攻擊手段。