雜湊是什麼
雜湊(Hashing)是將密碼等明文以單向轉換方式產生固定長度字串的處理。 相同輸入永遠會得到相同雜湊值,但無法從雜湊值還原成原本的明文。 Laravel 的Hash Facade 支援用於安全儲存密碼的 bcrypt 與 Argon2 雜湊演算法。
演算法比較
bcrypt 的「工作因子」控制產生雜湊所需的時間。雜湊越慢,對暴力破解的抵抗力就越高。當硬體變快時,可提高工作因子維持安全性。
雜湊與驗證流程
設定
Laravel 預設使用bcrypt 驅動。可透過 HASH_DRIVER 環境變數變更。
config:publish 發布設定檔。
config/hashing.php 更改預設工作因子等設定。
基本用法
對密碼進行雜湊
將明文密碼傳入Hash::make() 可得雜湊值,將此值存入資料庫。
調整 bcrypt 的工作因子
可透過rounds 選項調整產生雜湊的計算成本。值越大越安全,但耗時也越多。
預設值(12)在多數應用中都合宜。
調整 Argon2 的工作因子
使用 Argon2 時可透過memory、time、threads 調整計算成本。
密碼驗證
使用Hash::check() 可確認明文密碼是否與既存雜湊相符。
這在登入處理中是典型的用法。
Auth::attempt() 時,此驗證會自動進行,不必自行呼叫。
Hash::check() 適合用在手動確認目前密碼的情境。
判斷是否需重新雜湊
使用Hash::needsRehash() 可以確認產生雜湊時的工作因子是否與目前設定不同。
在你變更工作因子後,可將既有雜湊以新設定更新。
雜湊演算法驗證
預設情況下,Hash::check() 會確認雜湊是否以目前設定的演算法產生。
若演算法不同,會拋出 RuntimeException。
如此可防止透過竄改雜湊演算法的攻擊。
若正處於演算法遷移期,需要同時支援多個演算法,可將 HASH_VERIFY 設為 false 停用此驗證。
總結
下一步
認證入門
學習使用
Hash::check() 實作登入等,掌握認證的全貌。