password_hash()
在 PHP 5.5 及更高版本中可用。我很惊讶这里没有提到它。
使用 password_hash(),无需生成盐,因为盐是自动使用 bcrypt 算法生成的 —— 因此不需要编写一组字符。
相反,将用户提交的密码与存储在数据库中的唯一密码哈希值进行比较,可以使用 password_verify()。只需在用户数据库表中存储用户名和密码哈希值,就可以使用 password_verify() 将其与用户提交的密码进行比较。
password_hash() 的工作原理:
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]);
mysql_real_escape_string()
将图像存储在数据库中。 - rook