Heim > Fragen und Antworten > Hauptteil
Ich habe ein paar Tage damit verbracht, einige Fehler bei der Passwortüberprüfung in Laravel 9 zu beheben. Passwort testperson
解析为哈希值 yxc/wAmNCKV.YhpWOfyNoetCj/r3Fs5TyAskgZuIF/LEItWfm7rPW
. Eine direkte Abfrage der entsprechenden Datenbanktabelle bestätigt, dass es sich um den korrekten Hashwert handelt. Allerdings lehnt die Authentifizierungsinfrastruktur von Laravel dieses Passwort ab und verweigert die Authentifizierung.
Das ist nicht üblich. Ich habe mehrere Passwörter, die korrekt analysiert werden. Zum Beispiel Passwort eo
解析为 y$uNWYvMVmagIwQ2eXnVKLCOAK1QFQdcRtxbvlghf.Xpg0U1w.N./N2
und Laravel überprüft dieses Passwort. Derselbe Mechanismus erstellt beide Benutzerdatensätze, obwohl sie unterschiedliche Berechtigungen haben (angezeigt durch einen booleschen Wert im Datensatz).
Ich habe einen Fehler in einer Funktion password_verify
gefunden, die in dieser Frage zum Stapelüberlauf und in diesem Treehouse-Thread falsch-negative Ergebnisse zurückgibt.
Konkret handelt es sich hierbei um den Stack in Laravel, bei dem dieser Fehlerpunkt auftritt:
login
路由通过控制器类调用 IlluminateFoundationAuthAuthenticatesUsers::login
. login
方法调用 IlluminateFoundationAuthAuthenticatesUsers::attemptLogin
. attemptLogin
方法调用控制器守卫对象的 attempt
Methode. IlluminateAuthSessionGuard::attempt
调用 IlluminateAuthSessionGuard::hasValidCredentials
. IlluminateAuthSessionGuard::hasValidCredentials
调用守卫提供者对象上的 validateCredentials
Methode. IlluminateAuthEloquentUserProvider::validateCredentials
在其 hasher 对象上调用 check
Methode. IlluminateHashingHashManager::check
在其驱动程序上调用 check
Methode. IlluminateHashingBcryptHasher::check
调用 IlluminateHashingAbstractHasher::check
. IlluminateHashingAbstractHasher::check
Aufrufe IlluminateHashingAbstractHasher::check
调用 password_verify
. Nachdem ich den gesamten Stapel erweitert habe, führe ich den folgenden Code in der login
-Methode des Login-Controllers aus:
$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'));
Diesen Kontext löschen:
{ "password_verify": false, "password_unhashed": "testperson", "password_hashed": "yxc/wAmNCKV.YhpWOfyNoetCj/r3Fs5TyAskgZuIF/LEItWfm7rPW" }
Wenn ich dieses Passwort in die SELECT users WHERE password=
-Abfrage eingebe, erhalte ich den Benutzer, den ich erwarte.
Was ist los? Wie kann ich dieses Problem lösen?
P粉4640820612024-03-29 11:37:34
我认为您关于您提供的哈希值是“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... $2y$10$5xc/wAmNCKV.YhpWOfyNoeVNPMEcYrxepQeFAssFoAaIYs4WLmgZO $2y$10$5xc/wAmNCKV.YhpWOfyNoe $2y$10$5xc/wAmNCKV.YhpWOfyNoeVNPMEcYrxepQeFAssFoAaIYs4WLmgZO Verified. Doesn't need rehash. eo results... $2y$10$uNWYvMVmagIwQ2eXnVKLCOAK1QFQdcRtxbvlghf.Xpg0U1w.N./N2 $2y$10$uNWYvMVmagIwQ2eXnVKLCO $2y$10$uNWYvMVmagIwQ2eXnVKLCOAK1QFQdcRtxbvlghf.Xpg0U1w.N./N2 Verified. Doesn't need rehash. */ ?>