Yakim shu Hi, 這是我擴充腦內海馬體的地方。

[第十一週] 資訊安全 - 雜湊密碼:hash

為什麼密碼要經過雜湊?

一個安全的網頁資料庫應該儲存的是「 經過雜湊的密碼 」而不是使用者輸入時的明碼,這也是為什麼「 按下忘記密碼的按鈕,通常會導到重設密碼、而不是給你原先的密碼,因為資料庫也找不到原碼。」

所以由此推斷出,要是你在某網站按了忘記密碼,系統卻寄了一封「 你原本的密碼 」的 mail,請小心這代表此網站存的是明碼!

存明碼的風險是什麼? 代表此網站的資料庫要是被盜,密碼就被偷走了,所以現代網頁開發應該至少都要做到資料庫被偷,也不至於讓最重要的密碼被拿走或猜出來。

而讓密碼換一層皮的就稱為雜湊。這邊是個大家容易搞混的地方,要注意這步驟、不會稱為加密


雜湊、加密?

雖然目的同樣是讓密碼看起來像亂碼,但兩者最重要的差別就在於:「 加密可逆、雜湊不可密 」

雜湊:單向生成,無法反推出原來的原碼

最常見的攻擊方法:


加密:拿到密鑰的方式就可以逆推回去

參考資料:


PHP 內建雜湊函式 password_hash

(PHP 5 >= 5.5.0, PHP 7)

使用 password hash() 可以直接用最簡單的方式實踐複雜的加密,在使用時,需要搭配第二個參數,推薦直接使用 PASSWORD_DEFAULT

每次處理時,都會在背後產生隨機的 SALT。

當然,也可以手動指定要使用哪一個 SALT,但最好不要,就交給 PASSWORD_DEFAULT 來隨機處理,會更加安全

 <?php
$hash = password_hash('your_password', PASSWORD_DEFAULT);
?>

另外也可以搭配第三個 cost 參數 (默認為 10),當值調整越大,所需耗費的計算時間就會越多,可以自行測試。

<?php 
$password = '123456'; // 原始密碼
$hash_password = password_hash($password, PASSWORD_DEFAULT);
if (password_verify($password , $hash_password)){
   echo "密碼正確";
}else{  
   echo "密碼錯誤";
}
?>

參考資料:


( 以上內容大部分是 程式導師實驗計畫第三期 的學習筆記,如有錯誤歡迎糾正,非常感謝 🤓 )