Laravel 9 menolak cincang kata laluan yang sah dengan bcrypt
P粉270842688
P粉270842688 2024-03-28 17:22:24
0
1
493

Saya menghabiskan beberapa hari menyelesaikan masalah beberapa kegagalan pengesahan kata laluan dalam Laravel 9. Kata laluan testperson 解析为哈希值 yxc/wAmNCKV.YhpWOfyNoetCj/r3Fs5TyAskgZuIF/LEItWfm7rPW. Pertanyaan langsung jadual pangkalan data yang sepadan mengesahkan bahawa ini ialah nilai cincang yang betul. Walau bagaimanapun infrastruktur pengesahan Laravel menolak kata laluan ini dan menolak pengesahan.

Ini bukan perkara biasa. Saya mempunyai berbilang kata laluan yang menghuraikan dengan betul. Contohnya, kata laluan eo 解析为 y$uNWYvMVmagIwQ2eXnVKLCOAK1QFQdcRtxbvlghf.Xpg0U1w.N./N2, dan Laravel akan mengesahkan kata laluan itu. Mekanisme yang sama mencipta kedua-dua rekod pengguna, walaupun mereka mempunyai kebenaran yang berbeza (ditunjukkan oleh nilai boolean pada rekod).

Saya menemui pepijat dalam fungsi password_verify yang dikenal pasti sebagai mengembalikan negatif palsu dalam soalan Stack Overflow ini dan urutan Treehouse ini.

Secara khusus, ini ialah timbunan dalam Laravel di mana titik kegagalan ini berlaku:

  • login 路由通过控制器类调用 IlluminateFoundationAuthAuthenticatesUsers::login .
  • login 方法调用 IlluminateFoundationAuthAuthenticatesUsers::attemptLogin.
  • attemptLogin 方法调用控制器守卫对象的 attempt Kaedah.
  • IlluminateAuthSessionGuard::attempt 调用 IlluminateAuthSessionGuard::hasValidCredentials.
  • IlluminateAuthSessionGuard::hasValidCredentials 调用守卫提供者对象上的 validateCredentials Kaedah.
  • IlluminateAuthEloquentUserProvider::validateCredentials 在其 hasher 对象上调用 check Kaedah.
  • IlluminateHashingHashManager::check 在其驱动程序上调用 check Kaedah.
  • IlluminateHashingBcryptHasher::check 调用 IlluminateHashingAbstractHasher::check.
  • IlluminateHashingAbstractHasher::check panggilan IlluminateHashingAbstractHasher::check 调用 password_verify.

Selepas mengembangkan keseluruhan tindanan, saya menjalankan kod berikut dalam kaedah login pengawal log masuk:

$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'));

Buang konteks ini:

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

Jika saya memasukkan kata laluan itu ke dalam pertanyaan SELECT users WHERE password=, saya mendapat pengguna yang saya harapkan.

Apa yang sedang berlaku? Bagaimanakah saya boleh menyelesaikan masalah ini?

P粉270842688
P粉270842688

membalas semua(1)
P粉464082061

Saya rasa dakwaan anda bahawa hash yang anda berikan adalah hash "penguji" sebenarnya salah. Memandangkan cincangan adalah sehala, saya tidak dapat memberitahu anda dari mana datangnya cincangan yang ditunjukkan. NOTA: Ia berfungsi pada PHP 7.4, tetapi saya rasa ia tidak akan berfungsi pada PHP 8 dan ke atas kerana pilihan garam dalam passwd_hash() tidak digunakan lagi.

 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.
*/
?>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan