[ Laravel 5.8 文件 ] 安全系列 —— 雜湊
簡介
Laravel 的Hash
門面為儲存使用者密碼提供了安全的 Bcrypt 和 Argon2 雜湊演算法。如果你正在使用 Laravel 應用自帶的LoginController
和RegisterController
控制器,它們將會自動在註冊和認證時使用預設的 Bcrypt 演算法。
注:Bcrypt 是雜湊密碼的絕佳選擇,因為其「工作因子」是可調整的,這意味著隨著硬體功能的提升,生成雜湊所花費的時間也會增加。
配置
應用預設的雜湊驅動配置在配置檔案config/hashing.php
中,目前支援兩個驅動:Bcrypt
和Argon2
。
注:Argon2i 驅動要求 PHP 7.2.0 或更高版本,Argon2id 驅動要求 PHP 7.3.0 或更高版本。
基本使用
可以呼叫Hash
門面上的make
方法對儲存密碼進行雜湊:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use App\Http\Controllers\Controller; class UpdatePasswordController extends Controller { /** * 更新使用者密碼. * * @paramRequest$request * @return Response */ public function update(Request $request) { // 驗證新密碼長度... $request->user()->fill([ 'password' => Hash::make($request->newPassword) ])->save(); } }
調整 Bcrypt 工作因子
如果你使用的是 Bcrypt 演算法的話,make
方法允許你通過rounds
選項管理演算法的工作因子;不過,預設配置對大部分應用而言都是可接受的:
$hashed = Hash::make('password', [ 'rounds' => 12 ]);
調整 Argon2 工作因子
如果你使用的是 Argon2 演算法的話,make
方法允許你使用memory
、time
以及threads
選項來管理演算法的工作因子;不過,預設配置對大部分應用而言都是可接受的:
$hashed = Hash::make('password', [ 'memory' => 1024, 'time' => 2, 'threads' => 2, ]);
注:更多關於這些選項的資訊,請檢視PHP 官方文件 。
通過雜湊驗證密碼
check
方法允許你驗證給定原生字串和給定雜湊是否相等,不過,如果你在使用 Laravel 自帶的LoginController
(詳見登入認證文件),就不需要再直接使用check
方法,因為這個控制器自動呼叫了該方法:
if (Hash::check('plain-text', $hashedPassword)) { // 密碼匹配... }
檢查密碼是否需要被重新雜湊
needsRehash
方法允許你判斷雜湊計算器使用的工作因子在上次密碼被雜湊後是否發生改變:
if (Hash::needsRehash($hashed)) { $hashed = Hash::make('plain-text'); }
注:想了解更多關於雜湊演算法的原理以及 Laravel 底層密碼加密校驗實現可參考這篇文章http://laravelacademy.org/post/4764.html