1.password_hash — 创建密码的散列(hash)
(PHP 5 >= 5.5.0, PHP 7)
password_hash() 使用足够强度的单向散列算法创建密码的散列(hash)。 password_hash() 兼容 crypt()。 所以, crypt() 创建的密码散列也可用于 password_hash()。
参考:
http://www.php.net/manual/zh/function.password-hash.php
<?php
/**
* 我们想要使用默认算法散列密码
* 当前是 BCRYPT,并会产生 60 个字符的结果。
*
* 请注意,随时间推移,默认算法可能会有变化,
* 所以需要储存的空间能够超过 60 字(255字不错)
*/
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
?>
以上例程的输出类似于(每执行一次结果都不一样):
$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
2.password_verify — 验证密码是否和散列值匹配
(PHP 5 >= 5.5.0, PHP 7)
注意 password_hash() 返回的散列包含了算法、 cost 和盐值。 因此,所有需要的信息都包含内。使得验证函数不需要储存额外盐值等信息即可验证哈希。
参考:
http://www.php.net/manual/zh/function.password-verify.php
<?php
// 想知道以下字符从哪里来,可参见 password_hash() 的例子
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';
if (password_verify('rasmuslerdorf', $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
?>
以上例程会输出:
Password is valid!
总结
所以我们使用password_hash进行加密,用password_verify验证要比传统的MD5加密更加安全。需要注意的是,在数据库中存储散列值的长度最好大于60位,进行校验的时候先从数据库中取出散列值再用password_verify。