上次提到了密碼重設,可能有些對資安比較重視的讀者會感到好奇:那麼 Laravel 是怎麼處理我們的密碼呢?對密碼的保存方式是否足夠安全?
今天,我們就來看看 Laravel 是怎麼處理我們的密碼!
由於用戶可能會在不同的網站內使用同一組密碼,所以我們要避免密碼存在資料庫時,如果不小心外流的話,會造成嚴重的安全問題。所以一般來說,存在資料庫內的內容,會是雜湊(Hash)過後的字串。
有關密碼雜湊的部分,在昨天忘記密碼的處理上,其實已經有出現過了:
$user->forceFill([
'password' => Hash::make($request->password),
'remember_token' => Str::random(60),
])->save();
這邊的 Hash::make
就是協助我們處理雜湊的部分!
實際使用的演算法,則設置在 config/hashing.php
裡面
'driver' => 'bcrypt',
'bcrypt' => [
'rounds' => env('BCRYPT_ROUNDS', 10),
],
這邊可以看到,是使用 bcrypt 這個演算法來進行密碼的加密。
這也是在 OWASP Password Storage Cheat Sheet 裡面提到過可用的演算法之一。
- For legacy systems using bcrypt, use a work factor of 10 or more and with a password limit of 72 bytes.
透過 bcrypt 處理過後的密碼,看起來如下
$2y$10$sXFSmIZBYwaLB1swxrlh8OPcegpm7omsxf5zvi.exR.QpoG.00yja
前面的 $2y$
是 PHP 的 PASSWORD_BCRYPT
固定會加上的字串。後面的 10
代表密碼處理的次數(rounds
)。在後面就是密碼的雜湊了。值得注意的是,這邊已經自動的加上了 salt,所以即使是一樣的密碼,每次雜湊過後的結果都不會一樣。
如果覺得這個方式不夠安全,想換到 OWASP 建議的 Argon2,Laravel 也是支援的
'argon' => [
'memory' => 65536,
'threads' => 1,
'time' => 4,
],
這邊可以調整記憶體用量、運作時使用的線程(thread) 數目等等參數。
要確認密碼是否正確,可以用 Hash::check()
if (Hash::check('plain-text', $hashedPassword)) {
}
今天有關 Laravel 處理密碼的介紹就到這邊,我們明天見!