每次執行 password_hash('123456', PASSWORD_BCRYPT) 語句后,得到哈希值都不一樣!
給密碼做哈希之前,會先加入一個隨機子串,因為加入的隨機子串每次是不一樣的,所以得到的哈希值自然就不一樣了。這就讓在不同的服務中使用同一個密碼的用戶,他的密碼的安全性變高了。這個隨機子串就叫「鹽值」,加入鹽值的過程就是「加鹽處理」。
<?php
$passwordHash = password_hash('123456', PASSWORD_BCRYPT);
echo $passwordHash.PHP_EOL;
$flag = password_verify('123456',$passwordHash);
echo $flag.PHP_EOL;
<?php
function custom_function_for_salt() {
return md5(mt_rand(1111,9999));
}
$options = [
'salt' => custom_function_for_salt(), //自定義函數來獲得鹽值
'cost' => 12 // the default cost is 10
];
$passwordHash = password_hash('123456', PASSWORD_BCRYPT,$options);
echo $passwordHash.PHP_EOL;
$flag = password_verify('123456',$passwordHash);
echo $flag.PHP_EOL;
PASSWORD_BCRYPT 支持的選項:
salt(string) - 手動提供散列密碼的鹽值(salt)。這將避免自動生成鹽值(salt)。
省略此值后,password_hash() 會為每個密碼散列自動生成隨機的鹽值。這種操作是有意的模式。
Warning
鹽值(salt)選項從 PHP 7.0.0 開始被廢棄(deprecated)了。 現在最好選擇簡單的使用默認產生的鹽值。
cost (integer) - 代表算法使用的 cost。crypt() 頁面上有 cost 值的例子。
省略時,默認值是 10。 這個 cost 是個不錯的底線,但也許可以根據自己硬件的情況,加大這個值。