1. 简介
Laravel 是一个流行的 PHP Web 开发框架。在 Laravel 的开发中, 常常需要加密用户密码 ,因为存储明文密码是不安全的。Laravel 提供了一种本地的哈希算法 bcrypt,是一种强大、易于使用的密码哈希算法。但是,当需要比较两个 bcrypt 加密后的密码时,需要了解一些口诀和细节。
2. bcrypt 哈希算法
bcrypt 是一种密码哈希算法,其基于 Blowfish 加密算法并使用 salt 和 cost 变量提高其安全性。bcrypt算法先将密码和 salt 拼接后,使用 Blowfish 算法加密,并将结果输出。通常,输出结果是一个编码后长度为 60 个字符的哈希值。可以使用 PHP 的 password_hash() 函数生成 bcrypt 认证哈希值:
$password = 'secret';
$hash = password_hash($password, PASSWORD_BCRYPT);
echo $hash; // 输出长度为60个字符的哈希值
3. 比较两个 bcrypt 哈希值
Laravel 提供了一种快捷的方法来比较两个 bcrypt 哈希值,也就是使用 check() 方法。check() 方法比较一个明文字符串和 bcrypt 哈希后的密文字符串,如果两个字符串一致,则返回 true:
if (Hash::check('secret', $hashedPassword)) {
// 如果两个字符串一致,则返回 true
}
其中,第二个参数 $hashedPassword 是已经保存在数据库中的 bcrypt 哈希值。
3.1. 口诀
需要注意的是,在使用 check() 方法时,需要把明文密码作为第一个参数,而哈希后的密文字符串作为第二个参数。也就是说,第一个参数是未经加密的,另一个是加密后的。
遵循下面的口诀可以有效帮助记忆:
“有 bpp,比较锅灶”:第一个参数可以是明文密码(B),但第二个参数必须是 bcrypt 哈希值(pp)。也就是说,第一个参数可以被 hack,但第二个参数是安全的。
3.2. 示例
下面是一个比较两个 bcrypt 哈希值的完整示例:
$password = 'secret';
$hashedPassword = '$2y$10$LJrd9sGr0H1KSK8vVQVcMOZ0sQFpZ1t2qKZcKluXGDf9YOljxAF/6';
if (Hash::check($password, $hashedPassword)) {
echo '密码匹配成功!';
} else {
echo '密码匹配失败!';
}
注:check() 方法做的不仅仅是比较两个字符串是否相等,还会检查哈希字符串是否使用了正确的算法和是否具有正确的格式。