Laravel 9 拒绝使用 bcrypt 散列的有效密码
P粉270842688
P粉270842688 2024-03-28 17:22:24
0
1
501

我花了几天时间对 Laravel 9 中某些密码验证失败进行故障排除。密码 testperson 解析为哈希值 $2y$10$5xc/wAmNCKV.YhpWOfyNoetCj/r3Fs5TyAskgZuIF/LEItWfm7rPW。对相应数据库表的直接查询可确认这是正确的哈希值。然而 Laravel 的身份验证基础设施拒绝此密码并拒绝身份验证。

这并不普遍。我有多个可以正确解析的密码。例如,密码 eo 解析为 $2y$10$uNWYvMVmagIwQ2eXnVKLCOAK1QFQdcRtxbvlghf.Xpg0U1w.N./N2,并且 Laravel 会验证该密码。相同的机制创建这两个用户记录,尽管它们具有不同的权限(由记录上的布尔值指示)。

我找到了函数 password_verify 的错误,该函数被确定为在此 Stack Overflow 问题和此 Treehouse 线程中返回漏报。

具体来说,这是 Laravel 中出现此故障点的堆栈:

  • login 路由通过控制器类调用 \Illuminate\Foundation\Auth\AuthenticatesUsers::login
  • login 方法调用 \Illuminate\Foundation\Auth\AuthenticatesUsers::attemptLogin
  • attemptLogin 方法调用控制器守卫对象的 attempt 方法。
  • \Illuminate\Auth\SessionGuard::attempt 调用 \Illuminate\Auth\SessionGuard::hasValidCredentials
  • \Illuminate\Auth\SessionGuard::hasValidCredentials 调用守卫提供者对象上的 validateCredentials 方法。
  • Illuminate\Auth\EloquentUserProvider::validateCredentials 在其 hasher 对象上调用 check 方法。
  • Illuminate\Hashing\HashManager::check 在其驱动程序上调用 check 方法。
  • Illuminate\Hashing\BcryptHasher::check 调用 Illuminate\Hashing\AbstractHasher::check
  • Illuminate\Hashing\AbstractHasher::check 调用 password_verify

展开整个堆栈后,我在登录控制器的 login 方法中运行以下代码:

$provider = $this->guard()->getProvider();
$credentials =  $this->credentials($request);
$user = $provider->retrieveByCredentials($credentials);
$password_unhashed = $request['password'];
$password_hashed = $user->getAuthPassword();
$password_verify = password_verify($password_unhashed, $password_hashed);
logger('attemping login', compact('password_verify','password_unhashed','password_hashed'));

转储此上下文:

{
"password_verify": false,
"password_unhashed": "testperson",
"password_hashed": "yxc/wAmNCKV.YhpWOfyNoetCj/r3Fs5TyAskgZuIF/LEItWfm7rPW"
}

如果我将该密码放入 SELECT users WHERE password= 查询中,我就会得到我期望的用户。

这是怎么回事?我该如何解决这个问题?

P粉270842688
P粉270842688

全部回复(1)
P粉464082061

我认为您关于您提供的哈希值是“testperson”哈希值的断言实际上是错误的。由于散列是单向的,因此我无法告诉您所显示的散列是从何而来的。注意:它在 PHP 7.4 上运行,但我认为它不会在 PHP 8 及更高版本上运行,因为 passwd_hash() 中的 salt 选项已被弃用。

 10, "salt" => substr($testhash, 7, 22));
$pwhash = password_hash($password, PASSWORD_BCRYPT, $options);
echo $pwhash."\n";
$salt = substr($pwhash, 0, 29);
echo $salt."\n";
$cryptpw = crypt($password, $salt);
echo $cryptpw."\n";
if (password_verify($password, $cryptpw)) {
  echo("Verified.\n");
} else  {
  echo("NOT Verified.\n");
}
if (password_needs_rehash($cryptpw, PASSWORD_BCRYPT, $options)) {
  echo("Needs rehash.\n");
} else {
  echo("Doesn't need rehash.\n");
}

/*
testperson results...
yxc/wAmNCKV.YhpWOfyNoeVNPMEcYrxepQeFAssFoAaIYs4WLmgZO
yxc/wAmNCKV.YhpWOfyNoe
yxc/wAmNCKV.YhpWOfyNoeVNPMEcYrxepQeFAssFoAaIYs4WLmgZO
Verified.
Doesn't need rehash.

eo results...
y$uNWYvMVmagIwQ2eXnVKLCOAK1QFQdcRtxbvlghf.Xpg0U1w.N./N2
y$uNWYvMVmagIwQ2eXnVKLCO
y$uNWYvMVmagIwQ2eXnVKLCOAK1QFQdcRtxbvlghf.Xpg0U1w.N./N2
Verified.
Doesn't need rehash.
*/
?>
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板