password_hash()
在 PHP 5.5 和更新版本中可用。我很惊讶地发现这里没有提到它。
使用 password_hash() 不需要生成盐,因为盐是使用 bcrypt 算法自动生成的——因此不需要组成一组字符。
相反,使用 password_verify() 将用户提交的密码与存储在数据库中的唯一密码哈希进行比较。只需将用户名和密码哈希存储在用户数据库表中,然后您就可以使用 password_verify() 将其与用户提交的密码进行比较。
密码哈希()如何工作:
在将字符串存储在数据库中时,password_hash() 函数会输出唯一的密码哈希——建议该列最多允许 255 个字符。
$password = "goat";
echo password_hash($password, PASSWORD_DEFAULT);
echo password_hash($password, PASSWORD_DEFAULT);
echo password_hash($password, PASSWORD_DEFAULT);
// Output example (store this in the database)
$2y$10$GBIQaf6gEeU9im8RTKhIgOZ5q5haDA.A5GzocSr5CR.sU8OUsCUwq <- This hash changes.
$2y$10$7.y.lLyEHKfpxTRnT4HmweDKWojTLo1Ra0hXXlAC4ra1pfneAbj0K
$2y$10$5m8sFNEpJLBfMt/3A0BI5uH4CKep2hiNI1/BnDIG0PpLXpQzIHG8y
要验证散列密码,请使用password_verify()
:
$password_enc = password_hash("goat", PASSWORD_DEFAULT);
dump(password_verify('goat', $password_enc)); // TRUE
dump(password_verify('fish', $password_enc)); // FALSE
如果您愿意,可以选择手动添加盐,如下所示:
$password = 'MyPassword';
$salt = 'MySaltThatUsesALongAndImpossibleToRememberSentence+NumbersSuch@7913';
$hash = password_hash($password, PASSWORD_DEFAULT, ['salt'=>$salt]);
// Output: $2y$10$TXlTYWx0VGhhdFVzZXNBT.ApoIjIiwyhEvKC9Ok5qzVcSal7T8CTu <- This password hash not change.