本文主要和大家分享php實現密碼加密的方法執行個體,由於快速的散列演算法,所以不推薦使用
md5這個函數獲得密碼,password_hash()使用了一個強的雜湊演算法,來產生足夠強的鹽值,並且會自動進行合適的輪次。password_hash()是crypt()的一個簡單封裝,並且完全與現有的密碼雜湊相容。所以推薦使用password_hash()。
建立密碼的雜湊
string password_hash ( string $password , integer $algo [, array $options ] )
驗證密碼是否和雜湊匹配
boolean password_verify ( string $password , string $hash )
例:
<?php$hash = password_hash("rasmuslerdorf", PASSWORD_DEFAULT);if (password_verify('rasmuslerdorf', $hash)) { echo 'Password is valid!';} else { echo 'Invalid password.';}
提示說明:
建立密碼時不要自己設定鹽值
原因:強烈建議不要自己為這個函數產生鹽值(salt)。只要不設定,它會自動建立安全的鹽值。 就像以上提及的,在 PHP 7.0 提供 salt選項會導致廢棄(deprecation)警告。 未來的 PHP 發行版裡,手動提供鹽值的功能可能會被刪掉。
在自己的伺服器上做基準測試,調整 cost 參數直至函數時間開銷小於 100 毫秒(milliseconds)。
例:
<?php/** * 這個例子對伺服器做了基準測試(benchmark),檢測伺服器能承受多高的 cost * 在不明顯拖慢伺服器的情況下可以設定最高的值 * 8-10 是個不錯的底線,在伺服器夠快的情況下,越高越好。 * 以下代碼目標為 ≤ 100 毫秒(milliseconds), * 適合系統處理互動登入。 */$timeTarget = 0.1; // 100 毫秒(milliseconds) $cost = 8;do { $cost++; $start = microtime(true); password_hash("test", PASSWORD_BCRYPT, ["cost" => $cost]); $end = microtime(true);} while (($end - $start) < $timeTarget);echo "Appropriate Cost Found: " . $cost;
結果:
Appropriate Cost Found: 10