建立密碼雜湊
使用 password_hash()
建立密碼雜湊以使用當前行業最佳實踐標準雜湊或金鑰派生。在撰寫本文時,標準是 bcrypt ,這意味著,PASSWORD_DEFAULT
包含與 PASSWORD_BCRYPT
相同的值。
$options = [
'cost' => 12,
];
$hashedPassword = password_hash($plaintextPassword, PASSWORD_DEFAULT, $options);
第三個引數不是強制性的。
應根據生產伺服器的硬體選擇'cost'
值。增加它會使密碼生成成本更高。它產生的成本越高,任何人都試圖破解它以產生它的時間越長。理想情況下,成本應該儘可能高,但實際上應該設定成本,這樣就不會減慢太多的速度。介於 0.1 到 0.4 秒之間就可以了。如果你有疑問,請使用預設值。
Version < 5.5
在低於 5.5.0 的 PHP 上,password_*
功能不可用。你應該使用相容包來替換這些功能。請注意,相容包需要 PHP 5.3.7 或更高版本,或者將 $2y
修復程式反向移植到其中的版本(例如 RedHat 提供)。
如果你不能使用它們,你可以用 crypt()
實現密碼雜湊。由於 password_hash()
是作為 crypt()
函式的包裝器實現的,你不需要丟失任何功能。
// this is a simple implementation of a bcrypt hash otherwise compatible
// with `password_hash()`
// not guaranteed to maintain the same cryptographic strength of the full `password_hash()`
// implementation
// if `CRYPT_BLOWFISH` is 1, that means bcrypt (which uses blowfish) is available
// on your system
if (CRYPT_BLOWFISH == 1) {
$salt = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
$salt = base64_encode($salt);
// crypt uses a modified base64 variant
$source = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
$dest = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$salt = strtr(rtrim($salt, '='), $source, $dest);
$salt = substr($salt, 0, 22);
// `crypt()` determines which hashing algorithm to use by the form of the salt string
// that is passed in
$hashedPassword = crypt($plaintextPassword, '$2y$10$'.$salt.'$');
}
Salt 用於密碼雜湊
儘管 crypt 演算法具有可靠性,但仍然存在針對彩虹表的漏洞。這就是為什麼建議使用鹽的原因。
salt 是在雜湊之前附加到密碼以使源字串唯一的東西。給定兩個相同的密碼,產生的雜湊值也是唯一的,因為它們的鹽是獨特的。
隨機鹽是密碼安全性中最重要的部分之一。這意味著即使使用已知密碼雜湊的查詢表,攻擊者也無法將使用者的密碼雜湊與資料庫密碼雜湊匹配,因為已使用隨機鹽。你應該始終使用隨機和加密安全的鹽。閱讀更多
使用 password_hash()
bcrypt
演算法,純文字 salt 與生成的雜湊一起儲存,這意味著雜湊可以跨不同的系統和平臺傳輸,並且仍然可以與原始密碼進行匹配。
Version < 7
即使不鼓勵這樣做,也可以使用 salt
選項定義自己的隨機鹽。
$options = [
'salt' => $salt, //see example below
];
重要的。如果省略此選項,則每個密碼雜湊值將由 password_hash()
生成隨機鹽。這是預期的操作模式。
Version >= 7
自 PHP 7.0.0 起,salt 選項已被棄用 。現在優選簡單地使用預設生成的鹽。